51

CMakeでバイナリと検索/リンクされるライブラリのタイプを制御したいと思います。最終的な目標は、静的バージョンが使用可能なすべてのライブラリに対して静的にリンクする「可能な限り静的な」バイナリを生成することです。これは、テスト中にさまざまなシステム間でバイナリを移植できるようにするために重要です。

ATMは、FindXXX.cmakeパッケージ、より正確には、静的と動的の両方が使用可能な場合は常にfind_libraryコマンドが動的ライブラリを取得するため、これを実現するのは非常に難しいようです。

この機能を実装する方法のヒント(できればエレガントな方法で)は大歓迎です!

4

2 に答える 2

29

私はいくつかの調査を行い、問題に対する満足のいく解決策を見つけることができませんでしたが、私は半分の解決策を見つけました。

静的ビルドの問題は、次の3つに要約されます。

  1. プロジェクトの内部ライブラリを構築してリンクします。

    非常に簡単で、BUILD_SHARED_LIBSスイッチを切り替えるだけOFFです。

  2. 外部ライブラリの静的バージョンの検索。

    唯一の方法CMAKE_FIND_LIBRARY_SUFFIXESは、目的のファイルサフィックスを含めるように設定することのようです(これは優先順位リストです)。

    このソリューションは非常に「汚い」ソリューションであり、CMakeのクロスプラットフォームの願望に非常に反しています。私見では、これはCMakeによって舞台裏で処理される必要がありますが、私が理解している限り、Windowsでの「.lib」の混乱のため、CMake開発者は現在の実装を好むようです。

  3. システムライブラリに対して静的にリンクします。

LINK_SEARCH_END_STATICCMakeは、ドキュメントに基づいたオプションを提供します:「静的システムライブラリが使用されるようにリンクラインを終了します。」これで問題は解決したと思うでしょう。ただし、現在の実装はタスクに対応していないようです。オプションがオンになっている場合、CMakeは、リンカーに渡されたオプション(を含む)で終わる引数リストを使用して、暗黙のリンカー呼び出しを生成します-Wl,-Bstatic。ただし、これだけでは不十分です。リンカに静的にリンクするように指示するだけで、エラーが発生します。私の場合は次のようになります/usr/bin/ld: cannot find -lgcc_s。欠落しているのは、CMakeによってリンカー呼び出しに生成されない-static引数を介した静的リンクが必要であることもgccに通知することです。これはバグだと思いますが、まだ開発者からの確認を得ることができていません。

最後に、これはすべて、舞台裏でCMakeによって実行でき、実行する必要があると思います。結局のところ、Windowsでは不可能であることを除けば、それほど複雑ではありません。

于 2010-11-09T12:29:28.583 に答える
16

よくできた FindXXX.cmake ファイルには、このための何かが含まれています。FindBoost.cmake を見ると、Boost_USE_STATIC_LIBS 変数を設定して、静的ライブラリまたは共有ライブラリを見つけるかどうかを制御できます。残念ながら、パッケージの大半はこれを実装していません。

モジュールが find_library コマンドを使用する場合 (ほとんどの場合)、CMAKE_FIND_LIBRARY_SUFFIXES変数を使用して CMake の動作を変更できます。これを使用する FindBoost.cmake からの関連する CMake コードは次のとおりです。

IF(WIN32)
    SET(CMAKE_FIND_LIBRARY_SUFFIXES .lib .a ${CMAKE_FIND_LIBRARY_SUFFIXES})
ELSE(WIN32)
    SET(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES})
ENDIF(WIN32)

find_package を呼び出す前にこれを配置することも、.cmake ファイル自体を変更してコミュニティに貢献することもできます。

プロジェクトで使用する .cmake ファイルについては、それらすべてをソース管理内の独自のフォルダーに保管しています。これを行ったのは、一部のライブラリの正しい .cmake ファイルを保持することには一貫性がなく、独自のコピーを保持することで変更を加え、コードをチェックアウトしたすべての人が同じビルド システム ファイルを持つようにすることができたからです。

于 2010-11-08T17:52:33.223 に答える