cmake-genexを使用して、CMake ビルド時にのみ利用可能な情報に基づいて条件付きでライブラリをリンクできます。
例 1: lib ごとに 1 つの 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: すべてのライブラリに対して 1 つのジェネクスを使用する
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}>
)
ただし、例 2は失敗します。私の場合、忍者をジェネレーターとして使用しました。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
1 つのジェネクスは、条件付きで複数のライブラリにリンクするかどうかをどのように決定できますか?