C++ CMake 3.0添加接口中断类型的\u库获取\u目标\u属性

C++ CMake 3.0添加接口中断类型的\u库获取\u目标\u属性,c++,visual-studio-2013,cmake,C++,Visual Studio 2013,Cmake,我想向一个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}> ) 这将生成一个C

我想向一个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错误:

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中的错误吗?或者是否有其他方法可以实现这一点

为什么我们需要调用get_target_属性? 我们有一个cmake helper函数,它递归地遍历项目的所有依赖项,建立一个需要一些自定义后处理的所有依赖项目的列表。因此,如果ProjectX使用ProjectB和C,C使用D,那么我们会得到一个X、B、C、D的列表,然后检查哪些目录符合要求,然后调用一个定制的_命令

谢谢,
杰森

看来这是一个CMake错误。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()

如果这确实是一个CMake错误,请使用最新的CMake版本(目前为3.4)进行测试。如果它仍然存在,请提交一份bug报告。3.10版仍然存在问题,我已经提交了
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()