我在我的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在"配置时间"进行一些处理,在"生成时间"进行一些处理.
它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
| 归档时间: |
|
| 查看次数: |
4350 次 |
| 最近记录: |