0

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 つのジェネクスは、条件付きで複数のライブラリにリンクするかどうかをどのように決定できますか?

4

1 に答える 1

0

ジェネクスが引用符で囲まれている場合、すべてのライブラリに対して 1 つのジェネクスを使用できます。

すべてのライブラリに対して 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}>"
)

これにより、期待される出力が生成されます。

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

なぜ引用が機能するのかわかりません。他の誰かがこれを説明できるかもしれません。

于 2021-10-18T09:35:10.340 に答える