CMake 文档说明如下:
通过从依赖项中读取目标属性的 INTERFACE_ 变体并将值附加到操作数的非 INTERFACE_ 变体来传播使用要求。
这似乎是错误的。请看下面的最小示例:
cmake_minimum_required(VERSION 3.31.3)
project(main)
add_library(lib OBJECT lib.cpp)
set_property(TARGET lib PROPERTY INTERFACE_COMPILE_DEFINITIONS "DEFS")
add_executable(main main.cpp)
target_link_libraries(main PUBLIC lib)
function(print_property)
set(oneValueArgs TARGET PROPERTY)
cmake_parse_arguments(PARSE_ARGV 0 arg "" "${oneValueArgs}" "")
set(PROP "NONE")
get_property(PROP TARGET ${arg_TARGET} PROPERTY ${arg_PROPERTY})
message("${PROP}")
endfunction()
print_property(TARGET lib PROPERTY INTERFACE_COMPILE_DEFINITIONS)
print_property(TARGET lib PROPERTY COMPILE_DEFINITIONS)
print_property(TARGET main PROPERTY INTERFACE_COMPILE_DEFINITIONS)
print_property(TARGET main PROPERTY COMPILE_DEFINITIONS)
在配置阶段,只有第一条消息会打印一些内容(字符串DEFS
),其余消息则不打印任何内容。
问题:根据问题开头的引文,COMPILE_DEFINITIONS
的不应该main
用 填充吗?这个问题也与的有点相关。DEFS
INTERFACE_COMPILE_DEFINITIONS
main
建设阶段进展顺利 — —main.o
正在-DDEFS
按照预期进行建设。
属性的传播发生在配置过程的最后,即生成阶段。使用命令
get_target_property
无法检查传播的结果 - 此命令在传播尚未执行时立即提取属性的值。相反,通过生成器表达式引用属性并使用其中一种方法输出其值。例如
(当您构建项目时将创建自定义目标的输出)。
target_link_libraries
有趣的是,即使调用中的链接也被推迟到配置过程的结束。例如,在该调用中,您可以使用在其后创建的库目标: