这是我的项目树:
project
| + src
| + external
| | + foo
| | | + include
| | | | - foo.hpp
| | | + src
| | | | - foo.cpp
| | | | - CMakeLists.txt
| | | - CMakeLists.txt
| | + CMakeLists.txt
| + src
| | - main.cpp
| - CMakeLists.txtfoo.cpp包括foo.hpp:
// foo.cpp
#include "foo.hpp"现在的问题是,在顶层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) // NOT WORKING
add_subdirectory(src)
// project/external/foo/src/CMakeLists.txt
add_library(foo foo.cpp)发布于 2013-11-15 16:59:07
引用include_directories的文档
将包含目录添加到当前CMakeLists文件的目录属性INCLUDE_DIRECTORIES中。它们还会添加到当前CMakeLists文件中每个目标的目标属性INCLUDE_DIRECTORIES中。目标属性值是生成器使用的属性值。
INCLUDE_DIRECTORIES directory property继承到目录中的所有子目录和所有目标。
include_directories指定${CMAKE_CURRENT_SOURCE_DIR}是多余的,因为默认情况下,相对路径被解释为相对于此目录。您应该抛出它来增加包含目录,子目录和其父目录中的readability.get_property和message来仔细检查所有目录和目标是否最终在其INCLUDE_DIRECTORIES属性中包含正确的条目。include_directories,改用target_include_directories。这样做的好处是,在每个目标的基础上独占地解析包含的依赖关系,这通常是更理想的行为。发布于 2013-11-15 01:00:46
这可能是一个范围问题。我觉得您在这里要做的是将设置从/project/external/foo/CMakeLists传播到/project/CMakeLists,这样就可以将此设置传播到/project/src/CMakeLists。但不幸的是,除了缓存值之外,在cmake中不可能从较低级别的CMakeLists传播到较高级别的for。这意味着您还需要在/project/src/CMakeLists.txt中添加include_directories(${CMAKE_SOURCE_DIR}/external/foo/include)。或者,就像您已经做的那样,您可以只在顶级CMakeLists中添加此行。
https://stackoverflow.com/questions/19981534
复制相似问题