我似乎无法在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附近的报价,看看是否有帮助,但没有运气。
答案 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()。