使用CMake生成器表达式有条件地链接到库列表



CMake -genex可以根据仅在CMake构建时可用的信息有条件地链接库:

示例1:每个lib使用一个genex

cmake_minimum_required(VERSION 3.20.0)
project(cmake-genex)
add_library(lib1 SHARED source1.hpp source1.cpp)
add_library(lib2 SHARED source2.hpp source2.cpp)
add_library(lib3 SHARED source3.hpp source3.cpp)
add_executable(main main.cpp)
target_link_libraries(main
$<$<PLATFORM_ID:Linux>:lib1>
$<$<PLATFORM_ID:Linux>:lib2>
$<$<PLATFORM_ID:Linux>:lib3>
)

按预期工作,但是有点冗长。对所有库使用单个基因会很简洁:

示例2:对所有lib使用一个genex

cmake_minimum_required(VERSION 3.20.0)
project(cmake-genex)
add_library(lib1 SHARED source1.hpp source1.cpp)
add_library(lib2 SHARED source2.hpp source2.cpp)
add_library(lib3 SHARED source3.hpp source3.cpp)
set(linux_libs
lib1
lib2
lib3
)
add_executable(main main.cpp)
target_link_libraries(main
$<$<PLATFORM_ID:Linux>:${linux_libs}>
)

然而,Example2失败。在我的例子中,我使用忍者作为发电机。ninja.build显示如下:

ninja.build(摘录)

LINK_LIBRARIES = -Wl,-rpath,/mnt/c/Users/joakim.thoren/programming/cmake-genex/build  $<1:lib1  liblib2.so  -llib3>

我期望如下:

LINK_LIBRARIES = -Wl,-rpath,/mnt/c/Users/joakim.thoren/programming/cmake-genex/build  liblib1.so  liblib2.so  liblib3.so

一个genex如何决定是否有条件地链接到几个库?

如果genex加引号,则可以对所有库使用一个genex:

一个genex用于所有lib的工作示例

cmake_minimum_required(VERSION 3.20.0)
project(cmake-genex)
add_library(lib1 SHARED source1.hpp source1.cpp)
add_library(lib2 SHARED source2.hpp source2.cpp)
add_library(lib3 SHARED source3.hpp source3.cpp)
set(linux_libs
lib1
lib2
lib3
)
add_executable(main main.cpp)
target_link_libraries(main
"$<$<PLATFORM_ID:Linux>:${linux_libs}>"
)

这将产生预期的输出:

LINK_LIBRARIES = -Wl,-rpath,/mnt/c/Users/joakim.thoren/programming/cmake-genex/build  liblib1.so  liblib2.so  liblib3.so

我不知道为什么引用有效。也许别人能解释一下。

最新更新