我遇到了CMake get_target_property
的问题。它在稍后定义的库上运行并返回错误。这是我的代码:
add_library(UT_pal_logger OBJECT ${SOURCES})
target_add_interfaces(UT_pal_logger cppunit_addon)
在其他文件中有:
function(target_add_interfaces TARGET OTHER_TARGETS)
foreach(OTHER_TARGET ${OTHER_TARGETS})
get_target_property(TMP_INCLUDES ${OTHER_TARGET} INTERFACE_INCLUDE_DIRECTORIES)
if(TMP_INCLUDES)
target_include_directories(${TARGET} PUBLIC ${TMP_INCLUDES})
endif()
endforeach(OTHER_TARGET)
endfunction()
和
add_library(cppunit_addon STATIC ${SOURCES})
target_include_directories(cppunit_addon PUBLIC Include)
请注意,cppunit_addon
带来了UT_pal_logger
中使用的一些标题。
此操作失败并显示以下消息:
CMake Error at Scripts/CMake/target_add_interfaces.cmake:22 (get_target_property):
get_target_property() called with non-existent target "cppunit_addon".
Call Stack (most recent call first):
.../logger/CMakeLists.txt:36 (target_add_interfaces)
然而,这个配置和构建就好了:
add_library(UT_pal_logger STATIC ${SOURCES})
target_link_libraries(UT_pal_logger cppunit_addon)
---> target_link_libraries
不知何故等到所有内容都被解析而get_target_property
没有。这也是documented:
此命令可以获取任何目标到目前为止创建的属性。
我还可以更改add_directory
命令的顺序来解决此问题。但这不是一个干净的解决方案。如何使get_target_property
等到解析所有内容?
答案 0 :(得分:3)
如果您希望CMake在生成时而非配置时评估您的财产,则可以始终使用generator expressions。
如果成功测试了以下代码段:
add_library(UT_pal_logger OBJECT ${SOURCES})
target_include_directories(
UT_pal_logger
PUBLIC "$<TARGET_PROPERTY:cppunit_addon,INTERFACE_INCLUDE_DIRECTORIES>"
)
答案 1 :(得分:0)
较新版本的CMake还支持target_link_libraries
库中的OBJECT
的打开(或关闭)。
add_library(UT_pal_logger OBJECT ${SOURCES})
target_link_libraries(UT_pal_logger PUBLIC cppunit_addon)
target_link_libraries(other PUBLIC UT_pal_logger) # ands objects and links cppunit_addon
这些是CMake 3.14提供的单独功能。