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

时间:2017-12-18 09:17:00

标签: cmake

我遇到了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等到解析所有内容?

2 个答案:

答案 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提供的单独功能。