我有一个cmake构建,我正在搜索一堆依赖项,即我有很多实例:
FIND_PACKAGE(SomePackage)
if(SOMEPACKAGE_FOUND)
include_directories(${SOMEPACKAGE_INCLUDE_DIR})
link_libraries(${SOMEPACKAGE_LIBRARIES})
endif(SOMEPACKAGE_FOUND)
Run Code Online (Sandbox Code Playgroud)
现在,我想添加一个自定义命令来构建一个预编译的头文件,但要做到这一点,我需要知道我的include_directories调用添加的所有路径.如何获取这些目录的列表(最好使用正确的-I/path/to/directory格式),以便我可以将它们添加到我的自定义命令中?
这是我的项目树:
project
| + src
| + external
| | + foo
| | | + include
| | | | - foo.hpp
| | | + src
| | | | - foo.cpp
| | | | - CMakeLists.txt
| | | - CMakeLists.txt
| | + CMakeLists.txt
| + src
| | - main.cpp
| - CMakeLists.txt
Run Code Online (Sandbox Code Playgroud)
foo.cpp包括foo.hpp:
// foo.cpp
#include "foo.hpp"
Run Code Online (Sandbox Code Playgroud)
现在问题是包括顶部CMake中的目录成功找到foo.hpp,但如果我在子项目中包含它则不会.有什么理由吗?(在编译可执行文件之前包含目录).
// project/CMakeLists.txt
include_directories(external/foo/include) //OK
add_subdirectory(external)
add_executable(main main.cpp)
target_link_libraries(main foo)
// project/external/CMakeLists.txt
add_subdirectory(foo)
// project/external/foo/CMakeLists.txt
include_directories(include) …Run Code Online (Sandbox Code Playgroud) 我有一个设置,其中收集了多个要设置为包含目录的包含目录,如以下模拟所示:
add_library(testlib SHARED "")
set_target_properties(testlib PROPERTIES LINKER_LANGUAGE CXX)
list(APPEND includePath "/some/dir" "/some/other/dir")
target_include_directories(testlib PUBLIC
$<BUILD_INTERFACE:${includePath}>
)
Run Code Online (Sandbox Code Playgroud)
现在的问题是以下
get_target_property(debug testlib INTERFACE_INCLUDE_DIRECTORIES)
message("${debug}")
Run Code Online (Sandbox Code Playgroud)
版画
/home/user/test-proj/$<BUILD_INTERFACE:/some/dir;/some/other/dir>
Run Code Online (Sandbox Code Playgroud)
出于某种原因,项目的绝对路径位于include目录之前。这导致了cmake的宣告:
CMake Error in src/hypro/CMakeLists.txt:
Target "testlib" INTERFACE_INCLUDE_DIRECTORIES property contains path:
"/home/user/test-proj/"
which is prefixed in the source directory.
Run Code Online (Sandbox Code Playgroud)
我可以以某种方式使用列表$<BUILD_INTERFACE>吗?