首页 > 解决方案 > CMake INTERFACE_LINK_LIBRARIES 条目被修饰

问题描述

我最近对我拥有的一个库进行了一些 CMake 清理,主要的变化是我没有直接将我的目标导出到配置文件。同时,我想将目标添加到顶层 CMakeLists.txt,然后在递归到子目录时将源添加到该单个目标。

所以我的顶层CMakelists.txt包含:

add_library(Foo "")
add_library(Bar::Foo ALIAS Foo)

add_subdirectory(src)

srcCMakeLists.txt 中有

add_subdirectory(Buz)
add_subdirectory(Fuz)

在有Fuz_CMakeLists.txt

target_sources(Foo
  PUBLIC
    $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/FooSource.hpp>
    $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}/FooSource.hpp> 
  PRIVATE 
    FooSource.cpp  
)

target_include_directories(Foo
  PUBLIC
    $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}>
    $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}>    
)

target_link_libraries(Foo
  PUBLIC
    Bar::Buz # target from first sub dir add...eventually to be merged in like manner
  PRIVATE
    avcodec  
    avformat
    avutil
    swscale
)

在更改之前FooConfig.cmake,将安装的结果将包含以下行:

set_target_properties(Foo::Foo PROPERTIES
  INTERFACE_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include/Foo/klv_parser;${_IMPORT_PREFIX}/include/Foo/frame_source"
  INTERFACE_LINK_LIBRARIES "\$<LINK_ONLY:avcodec>;\$<LINK_ONLY:avformat>;\$<LINK_ONLY:avutil>;\$<LINK_ONLY:swscale>;\$<LINK_ONLY:Foo::foo_common>"
  INTERFACE_SOURCES "${_IMPORT_PREFIX}/include/Foo/klv_parser/KlvParser.hpp;${_IMPORT_PREFIX}/include/Foo/frame_source/FrameSource.hpp"

其中的LINK_ONLY库是我PRIVATEtarget_link_libraries. 然而,自从更改后,这些私有库已经被一个看似随机的十六进制数字装饰:

set_target_properties(Foo::Foo PROPERTIES
  INTERFACE_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include/Foo/klv_parser;${_IMPORT_PREFIX}/include/Foo/frame_source"
  INTERFACE_LINK_LIBRARIES "\$<LINK_ONLY:avcodec::@<0x2aaeb30>>;\$<LINK_ONLY:avformat::@<0x2aaeb30>>;\$<LINK_ONLY:avutil::@<0x2aaeb30>>;\$<LINK_ONLY:swscale::@<0x2aaeb30>>;\$<LINK_ONLY:Foo::foo_common::@<0x2aaeb30>>"
  INTERFACE_SOURCES "${_IMPORT_PREFIX}/include/Foo/klv_parser/KlvParser.hpp;${_IMPORT_PREFIX}/include/Foo/frame_source/FrameSource.hpp"
)

PUBLIC部分中的库target_link_libraries没有被修饰——只有部分中的库被修饰PRIVATE

我已经能够将其范围缩小到将add_library命令移动到更高级别的目录。即如果我CMakeLists.txtFuz目录中有:

add_library(Foo "")
add_library(Bar::Foo ALIAS Foo)

target_sources(Foo
  PUBLIC
    $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/FooSource.hpp>
    $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}/FooSource.hpp> 
  PRIVATE 
    FooSource.cpp  
)

target_include_directories(Foo
  PUBLIC
    $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}>
    $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}>    
)

target_link_libraries(Foo
  PUBLIC
    Bar::Buz # target from first sub dir add...eventually to be merged in like manner
  PRIVATE
    avcodec  
    avformat
    avutil
    swscale
)

(并且没有add_library命令位于顶层CMakeLists.txt)它们都可以正常工作。但如果我做的唯一改变是移动两条线

add_library(Foo "")
add_library(Bar::Foo ALIAS Foo)

到顶层CMakeLists.txt甚至是顶层,src然后出现这种奇怪的装饰。对我来说,这似乎真的是一个错误CMake,但也许不是?

我在 Ubuntu 18.04 上使用 CMake 3.15.5。完整的最小示例在这里:https ://github.com/jasonbeach/cmake_bug.git

标签: cmake

解决方案


这似乎是 CMake 中的一个错误。我最初使用的是 CMake 3.15.5,在故障排除过程中,更新到 CMake 3.19.6 并开始正常工作。它似乎已经固定在那里的某个地方。


推荐阅读