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

时间:2013-10-18 23:52:24

标签: cmake

我似乎无法在CMake中使用include_directories()命令设置包含路径(“-I”)。我的项目目录如下:

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文件如下所示:

project(ROOT)
add_subdirectory(libs)
add_subdirectory(proj1)

libs下的CMakeLists.txt文件:

project(lib)
add_library(lib STATIC ${lib_hdrs} ${lib_srcs}) // for conciseness, omitted set() 

最后,在proj1下的CMakeLists.txt文件

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应该做的事情。但是,尽管显式设置并使用调试消息($ {INCLUDE_DIRECTORIES}),INCLUDE_DIRECTORIES变量是一个空字符串,并且没有为包含路径指定目录,因此我的proj1编译失败。

我还尝试删除$ {ROOT_SOURCE_DIR} / inc附近的报价,看看是否有帮助,但没有运气。

1 个答案:

答案 0 :(得分:16)

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目标属性。

http://www.cmake.org/cmake/help/v2.8.12/cmake.html#command:target_include_directories

另请注意,您可以通过使用带有PUBLIC关键字的target_include_directories来编码“针对lib目标的头部编译,需要包含目录lib / inc”的事实到lib目标本身。

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目标'告诉'proj1它需要使用的包含目录。

另请参阅target_compile_defintions()和target_compile_options()。

相关问题