Cmake include_directories()

时间:2013-11-14 15:23:15

标签: c++ include cmake

这是我的项目树:

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)

2 个答案:

答案 0 :(得分:27)

引用include_directories的文档:

  

include目录被添加到directory属性中   当前CMakeLists文件的INCLUDE_DIRECTORIES。他们也是   添加到目标属性INCLUDE_DIRECTORIES中的每个目标   当前的CMakeLists文件。目标属性值是那些   发电机使用。

INCLUDE_DIRECTORIES directory property将继承到目录中的所有子目录和所有目标。

  • ${CMAKE_CURRENT_SOURCE_DIR}指定include_directories是多余的,因为默认情况下相对路径被解释为相对于此目录。你应该把它扔掉以增加可读性。
  • 在子目录及其父目录中指定include目录是多余的。你应该避免这种情况并在一个地方定居。
  • 使用get_propertymessage仔细检查所有目录和目标是否都以INCLUDE_DIRECTORIES属性中的正确条目结束。
  • 如果您可以自由地要求将CMake 2.8.11作为最低要求,请考虑完全放弃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中添加此行。