• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

在稍后定义的目标上调用get_target_property()

cmake 来源:kuga 7次浏览

我遇到CMake get_target_property问题。它在稍后定义的库上运行并返回错误。这是我的代码:在稍后定义的目标上调用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等到一切都被解析了?



===========解决方案如下:

如果您希望CMake在生成时评估您的财产,而不是在配置时间期间,您总是可以使用generator expressions。

如果成功地测试了下面的代码片断:

<code class="prettyprint-override">add_library(UT_pal_logger OBJECT ${SOURCES}) 
target_include_directories(
    UT_pal_logger 
    PUBLIC "$<TARGET_PROPERTY:cppunit_addon,INTERFACE_INCLUDE_DIRECTORIES>" 
) 
</code>

版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)