首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >装饰CMake INTERFACE_LINK_LIBRARIES条目

装饰CMake INTERFACE_LINK_LIBRARIES条目
EN

Stack Overflow用户
提问于 2021-02-24 08:49:36
回答 1查看 145关注 0票数 1

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

所以我有一个顶层的CMakelists.txt,它包含:

代码语言:javascript
复制
add_library(Foo "")
add_library(Bar::Foo ALIAS Foo)

add_subdirectory(src)

src中,CMakeLists.txt具有

代码语言:javascript
复制
add_subdirectory(Buz)
add_subdirectory(Fuz)

Fuz中,CMakeLists.txt具有

代码语言:javascript
复制
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将包含以下行:

代码语言:javascript
复制
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库是我在target_link_libraries中作为PRIVATE列出的库。然而,自更改以来,这些私有库被装饰成一个看似随机的十六进制数字:

代码语言:javascript
复制
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"
)

target_link_librariesPUBLIC部分中的库没有被修饰--只有PRIVATE部分中的库被修饰。

我已经能够将范围缩小到将add_library命令移动到更高级别的目录。例如,如果我在Fuz目录中的CMakeLists.txt具有:

代码语言:javascript
复制
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
)

(顶层CMakeLists.txt中没有add_library命令),它们都按其应有的方式工作。但如果我所做的唯一更改是移动这两行

代码语言:javascript
复制
add_library(Foo "")
add_library(Bar::Foo ALIAS Foo)

或者是顶层的CMakeLists.txt,或者甚至是src中的,那么这种奇怪的装饰就会发生。对我来说,这真的像是CMake中的一个bug,但也许不是?

我在Ubuntu18.04上使用的是CMake 3.15.5。完整的最小示例如下:https://github.com/jasonbeach/cmake_bug.git

EN

回答 1

Stack Overflow用户

发布于 2021-02-25 05:19:26

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66343131

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档