cmake - 如何从 CMakeLists.txt 文件设置 include_directories?

标签 cmake

我似乎在使用 -I 设置包含路径( include_directories() )时遇到问题CMake 中的命令。我的项目目录如下:

Root
| - CMakeLists.txt
| - libs
| - | - CMakeLists.txt
| - | - inc
| - | - | - // lib specific includes
| - | - src
| - | - | - // lib specific sources
| - proj1
| - | - CMakeLists.txt
| - | - inc
| - | - | - // proj1 specific includes
| - | - src
| - | - | - // proj1 specific sources

CMakeLists.txt文件看起来像这样:
project(ROOT)
add_subdirectory(libs)
add_subdirectory(proj1)
CMakeLists.txt文件下 libs :
project(lib)
add_library(lib STATIC ${lib_hdrs} ${lib_srcs}) // for conciseness, omitted set() 

最后,CMakeLists.txt文件下 proj1 :
project(proj1)

include_directories("${ROOT_SOURCE_DIR}/lib/inc") # <- problem line?

add_executable(proj1 ${proj1_srcs})
target_link_libraries(proj1 lib)

目标是从 libs 中的源文件和头文件创建库,然后链接到在 proj1 下生成的可执行文件。 Proj1 有一些文件 #include libs中的东西包括,所以我需要添加要与-I一起使用的目录.根据文档,这就是 include_directories()应该做。然而,尽管明确设置并跟随它进行调试 message(${INCLUDE_DIRECTORIES}) , INCLUDE_DIRECTORIES variable 是一个空字符串,并且没有为包含路径指定目录,所以我编译 proj1 失败。

我也尝试删除 ${ROOT_SOURCE_DIR}/inc 周围的引号看看这是否有帮助,但没有运气。

最佳答案

include_directories()填充名为 INCLUDE_DIRECTORIES 的目录属性:

http://www.cmake.org/cmake/help/v2.8.12/cmake.html#prop_dir:INCLUDE_DIRECTORIES

请注意,CMake 2.8.11 学习了 target_include_directories命令,填充 INCLUDE_DIRECTORIES目标属性(property)。
http://www.cmake.org/cmake/help/v2.8.12/cmake.html#command:target_include_directories

另请注意,您可以对“针对 lib 的头文件进行编译”这一事实进行编码。目标,包含目录 lib/inc需要'进入 lib使用 target_include_directories 定位自身与 PUBLIC关键词。

add_library(lib STATIC ${lib_hdrs} ${lib_srcs}) # Why do you list the headers?
target_include_directories(lib PUBLIC "${ROOT_SOURCE_DIR}/lib/inc")

另请注意,我假设您没有安装 lib供他人使用的库。在这种情况下,您需要为构建位置和安装位置指定不同的头目录。
target_include_directories(lib
  PUBLIC
    # Headers used from source/build location:
    "$<BUILD_INTERFACE:${ROOT_SOURCE_DIR}/lib/inc>"
    # Headers used from installed location:
    "$<INSTALL_INTERFACE:include>"     
)

无论如何,这仅在您安装 lib 时才重要。供他人使用。

target_include_directories(lib ...)上面你不需要另一个 include_directories()称呼。 lib target '告诉' proj1 它需要使用的包含目录。

另见 target_compile_defintions() target_compile_options() .

关于cmake - 如何从 CMakeLists.txt 文件设置 include_directories?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19460707/

相关文章:

c++ - 处理具有多个子项目的 CMake 项目的依赖关系

opencv - 无法在Opencv GPU中检测启用CUDA的设备

CMake - 强制 find_package 更新缓存变量

cmake - cmake 宏中的可选参数

c++ - CMAKE - 调试/交叉构建?

c++ - 导入库的 include_directories

c++ - CMake 找不到 libcurl-config.cmake

gcc - 在编译文件中包含 mingw 库

c++11 - 使用 CMake 在 NVCC 中触发 C++11 支持

xcode - 如何使用 CMake 将 Info.plist 捆绑在 MacOSX 应用程序中?