Cmake include_directories()

mem*_*ecs 16 c++ cmake include

这是我的项目树:

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) // NOT WORKING
add_subdirectory(src)

// project/external/foo/src/CMakeLists.txt 
add_library(foo foo.cpp)
Run Code Online (Sandbox Code Playgroud)

Com*_*sMS 29

引用文档include_directories:

include目录被添加到当前CMakeLists文件的目录属性INCLUDE_DIRECTORIES中.它们也会添加到当前CMakeLists文件中每个目标的目标属性INCLUDE_DIRECTORIES中.目标属性值是生成器使用的值.

INCLUDE_DIRECTORIES目录属性继承目录中的所有子目录和所有目标.

  • 指定${CMAKE_CURRENT_SOURCE_DIR}for include_directories是冗余的,因为默认情况下相对路径被解释为相对于此目录.你应该把它扔掉以增加可读性.
  • 在子目录及其父目录中指定include目录是多余的.你应该避免这种情况并在一个地方定居.
  • 使用get_propertymessage仔细检查所有目录和目标是否以其INCLUDE_DIRECTORIES属性中的正确条目结束.
  • 如果您可以自由地要求CMake 2.8.11作为最低要求,请考虑include_directories完全放弃并使用target_include_directories.这具有以下优点:包括依赖性依赖于每个目标,这通常是更理想的行为.