我最近对我拥有的一个库做了一些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库是我在target_link_libraries中作为PRIVATE列出的库。然而,自更改以来,这些私有库被装饰成一个看似随机的十六进制数字:
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_libraries的PUBLIC部分中的库没有被修饰--只有PRIVATE部分中的库被修饰。
我已经能够将范围缩小到将add_library命令移动到更高级别的目录。例如,如果我在Fuz目录中的CMakeLists.txt具有:
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命令),它们都按其应有的方式工作。但如果我所做的唯一更改是移动这两行
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
发布于 2021-02-25 05:19:26
这似乎是CMake中的一个错误。我最初使用的是CMake 3.15.5,在排除故障的过程中,我更新到了CMake 3.19.6,它开始正常工作。它似乎已经被修复在那里的某个地方。
https://stackoverflow.com/questions/66343131
复制相似问题