43

他の多くの静的ライブラリに依存している CMake で静的ライブラリを構築しています。それらをすべて出力 .lib/.a ファイルに含めたいので、大きな lib ファイルだけを顧客に出荷できます。Visual Studio 2010 には、まさにこれを行う"Link Library Dependencies"というオプションがあります。

しかし、CMakeでそれを行う方法が見つかりません。このフラグを CMake 経由で設定できますか、または別の方法で同じ結果を得ることができますか? target_link_libraries(...) と add_dependencies(...) を試しましたが、CMake は静的ライブラリのこの行を単に無視しているようです。

4

2 に答える 2

21

さて、解決策があります。まず、静的ライブラリが他の静的ライブラリをコードにリンクしないことを認識することが重要です。結合されたライブラリを作成する必要があります。これは、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です。

于 2013-01-07T17:13:08.223 に答える