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

HD_*_*use 14 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
Run Code Online (Sandbox Code Playgroud)

根CMakeLists文件如下所示:

project(ROOT)
add_subdirectory(libs)
add_subdirectory(proj1)
Run Code Online (Sandbox Code Playgroud)

libs下的CMakeLists.txt文件:

project(lib)
add_library(lib STATIC ${lib_hdrs} ${lib_srcs}) // for conciseness, omitted set() 
Run Code Online (Sandbox Code Playgroud)

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

project(proj1)

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

add_executable(proj1 ${proj1_srcs})
target_link_libraries(proj1 lib)
Run Code Online (Sandbox Code Playgroud)

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

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

ste*_*ire 18

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")
Run Code Online (Sandbox Code Playgroud)

另请注意,我假设您没有安装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>"     
)
Run Code Online (Sandbox Code Playgroud)

无论如何,这是唯一重要的,如果您正在安装lib供其他人使用.

在上面的target_include_directories(lib ...)之后,您不需要其他include_directories()调用.lib目标'告诉'proj1它需要使用的包含目录.

另请参见target_compile_defintions()和target_compile_options().