我的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}")
哪个输出
Moggle interface includes: "/home/nick/code/onegame/motor/moggle/include"
Motor includes:" "
怎么会这样?当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
...拿起INTERFACE_INCLUDE_DIRECTORIES并将它们添加到马达中,那么我在做什么错呢?
最佳答案
CMake在“配置时间”进行一些处理,并在“生成时间”进行一些处理。message()
在配置时执行,但是链接库仅在生成时稍后评估。因为您的包含目录依赖于链接的库,所以包含目录在生成时间之前不会得到完全解析。file(GENERATE)
命令在生成时评估generator expression
内容并将其写入文件,因此,类似这样的操作会将最终的include目录写入include.txt:
file(GENERATE
OUTPUT "includes.txt"
CONTENT "$<TARGET_PROPERTY:motor,INCLUDE_DIRECTORIES>\n"
)
如果您要调试,请尝试将CMAKE_VERBOSE_MAKEFILE设置为
1
以查看编译器命令行或尝试设置set(CMAKE_DEBUG_TARGET_PROPERTIES INCLUDE_DIRECTORIES)
它将向您显示每个目标上每个包含目录的来源回溯。
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
关于cmake - CMake没有获取链接库的INTERFACE_INCLUDE_DIRECTORIES,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24091287/