CMake没有选择链接库的INTERFACE_INCLUDE_DIRECTORIES

Nic*_*ick 4 cmake

我在我的cmake文件中有这个

get_target_property(moggle_interface_includes moggle INTERFACE_INCLUDE_DIRECTORIES)
message("Moggle interface includes: ${moggle_interface_includes}")

target_link_libraries(motor
    moggle
)

get_target_property(motor_includes motor INCLUDE_DIRECTORIES)
message("MOTOR includes ${motor_includes}")
Run Code Online (Sandbox Code Playgroud)

哪个输出这个

Moggle interface includes: "/home/nick/code/onegame/motor/moggle/include"
Motor includes:" "
Run Code Online (Sandbox Code Playgroud)

怎么会这样?当moggle被链接时,它也应该,根据这个

CMake will also propagate "usage requirements" from linked library targets. Usage 
requirements affect compilation of sources in the <target>. They are specified by 
properties defined on linked targets. During generation of the build system, CMake 
integrates usage requirement property values with the corresponding build properties for 
<target>:

     INTERFACE_COMPILE_DEFINITONS: Appends to COMPILE_DEFINITONS
     INTERFACE_INCLUDE_DIRECTORIES: Appends to INCLUDE_DIRECTORIES
Run Code Online (Sandbox Code Playgroud)

...拿起INTERFACE_INCLUDE_DIRECTORIES并将它们添加到电机中,那么我做错了什么?

  • CMake verison:cmake版本2.8.12.2
  • 操作系统:Arch Linux

ste*_*ire 9

CMake在"配置时间"进行一些处理,在"生成时间"进行一些处理.

message()在配置时执行,但链接库仅在生成时间稍后进行评估.由于include目录依赖于链接库,因此在生成时间之前,include目录不会完全解析.

file(GENERATE)命令generator expression在生成时评估内容并将其写入文件,因此这样的内容会将最终的include目录写入includes.txt:

file(GENERATE 
    OUTPUT "includes.txt" 
    CONTENT "$<TARGET_PROPERTY:motor,INCLUDE_DIRECTORIES>\n"
)
Run Code Online (Sandbox Code Playgroud)

如果你的目的是调试,那么尝试设置CMAKE_VERBOSE_MAKEFILE 1以查看编译器命令行或尝试设置

set(CMAKE_DEBUG_TARGET_PROPERTIES INCLUDE_DIRECTORIES)
Run Code Online (Sandbox Code Playgroud)

它将显示每个目标上每个包含目录的来源的回溯.

http://www.cmake.org/cmake/help/v3.0/manual/cmake-generator-expressions.7.html

http://www.cmake.org/cmake/help/v3.0/manual/cmake-buildsystem.7.html

http://www.cmake.org/cmake/help/v3.0/variable/CMAKE_DEBUG_TARGET_PROPERTIES.html

http://www.cmake.org/cmake/help/git-master/command/file.html