如何解决CMake target_include_directories 相对于父目录? CMakeLists.txtlib0/CMakeLists.txtlib0/header0.hlib0/header0.clib1/CMakeLists.txtlib1/header1.hlib1/header1.cmain/CMakeLists.txtmain/main.c
如何将 lib0
路径添加到 lib1
以便从 header1.h
我可以#include <header0.h>
?
| CMakeLists.txt
+---lib0
| CMakeLists.txt
| header0.c
| header0.h
+---lib1
| CMakeLists.txt
| header1.c
| header1.h
\---main
CMakeLists.txt
main.c
CMakeLists.txt
cmake_minimum_required(VERSION 3.19)
project(c_multilib C)
foreach (sub "lib0" "lib1" "main")
add_subdirectory("${sub}")
endforeach ()
lib0/CMakeLists.txt
add_library(lib0 "header0.h" "header0.c")
set_target_properties(lib0 PROPERTIES LINKER_LANGUAGE C)
include(GenerateExportHeader)
set(_generated_export_header "${CMAKE_CURRENT_SOURCE_DIR}/lib0_export.h")
generate_export_header(lib0 EXPORT_FILE_NAME "${_generated_export_header}")
target_include_directories(lib0
INTERFACE
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>"
"$<INSTALL_INTERFACE:include>"
)
install(FILES "header0.h" "${_generated_export_header}" DESTINATION "include")
lib0/header0.h
#ifndef C_MULTILIB_HEADER0_H
#define C_MULTILIB_HEADER0_H
#include "lib0_export.h"
int LIB0_EXPORT sum(int,int);
#endif /* C_MULTILIB_HEADER0_H */
lib0/header0.c
#include "header0.h"
int sum(int a,int b) {return a+b;}
lib1/CMakeLists.txt
add_library(lib1 "header1.h" "header1.c")
set_target_properties(lib1 PROPERTIES LINKER_LANGUAGE C)
include(GenerateExportHeader)
set(_generated_export_header "${CMAKE_CURRENT_SOURCE_DIR}/lib1_export.h")
generate_export_header(lib1 EXPORT_FILE_NAME "${_generated_export_header}")
target_include_directories(lib1
INTERFACE
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>"
"$<BUILD_INTERFACE:${${PROJECT_NAME}_SOURCE_DIR}/lib0>"
"$<INSTALL_INTERFACE:include>"
)
install(FILES "header1.h" "${_generated_export_header}" DESTINATION "include")
lib1/header1.h
#ifndef C_MULTILIB_HEADER1_H
#define C_MULTILIB_HEADER1_H
#include <header0.h>
#include "lib1_export.h"
int LIB1_EXPORT add1(int);
#endif /* C_MULTILIB_HEADER1_H */
lib1/header1.c
#include <header1.h>
int add1(int a) {return sum(a,1);}
main/CMakeLists.txt
add_executable("main" "main.c")
target_link_libraries("main" "lib0" "lib1")
target_include_directories(
"main"
INTERFACE
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>"
"$<BUILD_INTERFACE:${${PROJECT_NAME}_SOURCE_DIR}/lib0>"
"$<BUILD_INTERFACE:${${PROJECT_NAME}_SOURCE_DIR}/lib1>"
"$<INSTALL_INTERFACE:include>"
)
main/main.c
#include <header0.h>
#include <header1.h>
#include <stdio.h>
#include <stdlib.h>
int main(void) {
printf("sum(1,5) =\t%d\n"
"add1(5) =\t%d\n",sum(1,5),add1(6));
return EXIT_SUCCESS;
}
尝试:
# lib1/CMakeLists.txt
target_include_directories(
lib1
INTERFACE
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>"
#"$<BUILD_INTERFACE:lib0>"
#"$<BUILD_INTERFACE:../../lib0>"
#"$<BUILD_INTERFACE:${${PROJECT_NAME}_SOURCE_DIR}/src/lib0>"
"$<INSTALL_INTERFACE:include>"
)
install(FILES "header1.h" DESTINATION "include")
错误范围:
致命错误 C1083:无法打开包含文件:'header0.h':没有那个文件或目录
到:
目标在其 INTERFACE_INCLUDE_DIRECTORIES 中包含相对路径
还 get_target_property(LIB0_INCLUDES "lib0" INCLUDE_DIRECTORIES)
给了:
get_target_property() 使用不存在的目标“lib0”调用。
解决方法
src/lib0/CMakeLists.txt
应该看起来像这样
add_library(lib0 INTERFACE)
target_include_directories(lib0 INTERFACE ${CMAKE_CURRENT_LIST_DIR})
单词 INTERFACE
告诉 Cmake 没有什么可编译的。
src/lib1/CMakeLists.txt
应该看起来像这样
add_library(lib1 INTERFACE)
target_include_directories(lib1 INTERFACE ${CMAKE_CURRENT_LIST_DIR})
target_link_libraries(lib1 INTERFACE lib0)
src/CMakeLists.txt
应该看起来像
add_subdirectory(lib0)
add_subdirectory(lib1)
# Assuming that your src target is called my_proj:
target_link_libraries(my_proj PRIVATE lib0 lib1)
编辑:
如果您将所有包含从 lib1_export...
更改为 header1
并修改以下 3 个 CMakeLists.txt 文件,我可以确认您提供的代码可以编译:
lib0/CMakeLists.txt
:
add_library(lib0 header0.c)
target_include_directories(lib0 PUBLIC ${CMAKE_CURRENT_LIST_DIR})
lib1/CMakeLists.txt
:
add_library(lib1 header1.c)
target_include_directories(lib1 PUBLIC ${CMAKE_CURRENT_LIST_DIR})
target_link_libraries(lib1 PUBLIC lib0)
main/CMakeLists.txt
:
add_executable(main main.c)
target_link_libraries(main PRIVATE lib0 lib1)
我不清楚您要使用生成器表达式(尖括号)实现什么目标。如果您解释了您要完成的任务,那么我们可以提出适当的修复建议。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。