さて、解決策があります。まず、静的ライブラリが他の静的ライブラリをコードにリンクしないことを認識することが重要です。結合されたライブラリを作成する必要があります。これは、Linux では で実行できますar
。詳細については、静的ライブラリを他の静的ライブラリにリンクするを参照してください。
次の 2 つのソース ファイルを検討してください。
test1.c:
int hi()
{
return 0;
}
test2.c:
int bye()
{
return 1;
}
このCMakeLists.txt
ファイルは、2 つのライブラリを作成し、結合されたライブラリを次のように作成します。
project(test)
add_library(lib1 STATIC test1.c)
add_library(lib2 STATIC test2.c)
add_custom_target(combined ALL
COMMAND ${CMAKE_AR} rc libcombined.a $<TARGET_FILE:lib1> $<TARGET_FILE:lib2>)
ar
この場合、コマンドのオプションはプラットフォームに依存しますが、CMAKE_AR
変数はプラットフォームに依存しません。これを行うためのより一般的な方法があるかどうかを調べてみますが、このアプローチは を使用するシステムで機能しますar
。
CMAKE_AR のオプションを設定するにはどうすればよいですか? に基づく 、これを行うためのより良い方法は次のようになります。
add_custom_target(combined ALL
COMMAND ${CMAKE_CXX_ARCHIVE_CREATE} libcombined.a $<TARGET_FILE:lib1> $<TARGET_FILE:lib2>)
これは、CMake によって内部的にアーカイブを作成するために使用されるコマンド構造であるため、プラットフォームに依存しない必要があります。もちろん、アーカイブ コマンドに渡したい唯一のオプションはrc
、これらがコマンドの CMake に組み込まれているためar
です。