cmake - CMake INTERFACE_LINK_LIBRARIES 条目被修饰
问题描述
我最近对我拥有的一个库进行了一些 CMake 清理,主要的变化是我没有直接将我的目标导出到配置文件。同时,我想将目标添加到顶层 CMakeLists.txt,然后在递归到子目录时将源添加到该单个目标。
所以我的顶层CMakelists.txt
包含:
add_library(Foo "")
add_library(Bar::Foo ALIAS Foo)
add_subdirectory(src)
在src
CMakeLists.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
库是我PRIVATE
在target_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.txt
在Fuz
目录中有:
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 3.15.5,在故障排除过程中,更新到 CMake 3.19.6 并开始正常工作。它似乎已经固定在那里的某个地方。
推荐阅读
- gradle - 在 gradle 6.0.1 中找不到参数的方法 compileOnly()
- amazon-web-services - 如何使用 Elastic Beanstalk 和 django-cms 上传图像
- python - cv2.findContours 找不到轮廓
- python-3.x - 当没有其他python进程同时写入sqlite db数据库时,为什么会锁定它?
- c++ - 将 PrimitiveBatch::DrawIndexed 与 ID3D11DeviceContext::DrawIndexed 一起使用?
- python - 如何在 PyQt5 中创建浏览器?
- flutter - 在用户点击(平面按钮)上创建一个新的小部件
- javascript - javascript将我所有解密的html列表放入HTML
- python - 将 .txt 网址保存在文件夹中
- docker - Docker 服务以退出代码 0 退出 - Nuls CHAINBOX