17

这是我的项目树:

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)
4

2 回答 2

29

引用文档include_directories

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

INCLUDE_DIRECTORIES目录属性被继承到目录中的所有子目录和所有目标。

  • 指定${CMAKE_CURRENT_SOURCE_DIR}forinclude_directories是多余的,因为默认情况下相对路径被解释为相对于该目录。你应该把它扔掉以增加可读性。
  • 在子目录及其父目录中指定包含目录是多余的。您应该避免这种情况并选择一个位置。
  • 使用get_propertymessage仔细检查所有目录和目标是否在其INCLUDE_DIRECTORIES属性中具有正确的条目。
  • 如果您可以随意将 CMake 2.8.11 作为最低要求,请考虑include_directories完全放弃并target_include_directories改用。这样做的好处是包含依赖项仅在每个目标的基础上得到解决,这通常是更理想的行为。
于 2013-11-15T08:59:07.107 回答
0

这可能是一个范围问题。我觉得您在这里尝试做的是从 to 传播设置,/project/external/foo/CMakeLists 以便 /project/CMakeLists可以将该设置传播到/project/src/CMakeLists. 但不幸的是,在 cmake 中不可能从低级到高级 CMakeLists 传播,除了缓存值。这意味着您还需要${CMAKE_SOURCE_DIR}/external/foo/include/project/src/CMakeLists.txt. 或者,就像您已经做的那样,您可以在顶级 CMakeLists 中添加这一行。

于 2013-11-14T17:00:45.610 回答