这是我的项目树:
project
| + src
| + external
| | + foo
| | | + include
| | | | - foo.hpp
| | | + src
| | | | - foo.cpp
| | | | - CMakeLists.txt
| | | - CMakeLists.txt
| | + CMakeLists.txt
| + src
| | - main.cpp
| - CMakeLists.txt
foo.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)
答案 0 :(得分:27)
引用include_directories
的文档:
include目录被添加到directory属性中 当前CMakeLists文件的INCLUDE_DIRECTORIES。他们也是 添加到目标属性INCLUDE_DIRECTORIES中的每个目标 当前的CMakeLists文件。目标属性值是那些 发电机使用。
INCLUDE_DIRECTORIES
directory property将继承到目录中的所有子目录和所有目标。
${CMAKE_CURRENT_SOURCE_DIR}
指定include_directories
是多余的,因为默认情况下相对路径被解释为相对于此目录。你应该把它扔掉以增加可读性。get_property
和message
仔细检查所有目录和目标是否都以INCLUDE_DIRECTORIES
属性中的正确条目结束。include_directories
并改为使用target_include_directories
。这样做的好处是,包含依赖关系只能在每个目标的基础上解决,这通常是更理想的行为。答案 1 :(得分:0)
这可能是范围问题。我觉得您在这里要做的是将设置从/project/external/foo/CMakeLists
传播到/project/CMakeLists
,以便将此设置传播到/project/src/CMakeLists
。但遗憾的是,除了缓存值之外,cmake中无法从较低级别传播到较高级别的CMakeLists。这意味着您还需要在${CMAKE_SOURCE_DIR}/external/foo/include
中添加include_directories(/project/src/CMakeLists.txt
)。或者,正如您已经做过的那样,您可以在顶级CMakeLists中添加此行。