CMake 3.0添加INTERFACE类型的库中断了get目标属性

oyjwcjzk  于 2023-01-13  发布在  其他
关注(0)|答案(2)|浏览(236)

我想添加一个标头目录到一个cmake项目,我在Windows 7中使用的Visual Studio 2013 Update 2。我做了一些研究,并提出了这个Cmakelists.txt文件:

add_library(AAA_lib INTERFACE)
target_include_directories(AAA_lib
    INTERFACE
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
    )

这看起来是可行的,但是在我们的一些内部cmake代码中,我们称之为get_target_property:

get_target_property(target_libraries ${target} LINK_LIBRARIES)

这将生成CMake错误:

CMake Error at x_common_libs/xml/xsdmap.cmake:41 (get_target_property):
  INTERFACE_LIBRARY targets may only have whitelisted properties.  The
  property "LINK_LIBRARIES" is not allowed.

这似乎是一个奇怪的错误,因为get应该只返回具有适当属性的目标。这是CMake中的bug吗?还是应该用其他方法来实现?
为什么我们需要调用get_target_property?我们有一个cmake helper函数,它递归地遍历一个项目的所有依赖项,建立一个需要一些自定义后处理的所有依赖项目的列表。因此,如果项目X使用项目B和C,而C使用D,那么我们会得到一个X,B,C,D的列表,然后检查哪些目录符合要求,然后调用custom_command。
谢谢你,杰森

x33g5p2x

x33g5p2x1#

似乎是CMake bug。CMake 3.0中有一个新的目标类型,名为INTERFACE_LIBRARY。您应该只使用该类型的一些属性。但是,我不认为在阅读其他属性时会引发错误。
我提出了以下解决方案:

get_target_property(_TARGET_TYPE ${target} TYPE)
if(_TARGET_TYPE STREQUAL "INTERFACE_LIBRARY")
  unset(target_libraries)
else()
  get_target_property(target_libraries ${target} LINK_LIBRARIES)
endif()
8yparm6h

8yparm6h2#

这是在CMake 3.19中取消的限制。
有关详细信息,请参见https://gitlab.kitware.com/cmake/cmake/-/issues/19145

相关问题