web-dev-qa-db-ja.com

プロジェクトがライブラリを静的にリンクするようにcmakeに指示するにはどうすればよいですか?

Linuxで実行されているCMakeを使用してOpenCVベースのプロジェクトを構築しようとしています。これまでのところCMakeLists.txtファイルは次のようになります

FIND_PACKAGE (OpenCV REQUIRED)
...
TARGET_LINK_LIBRARIES (my-executable ${OpenCV_LIBS})

しかし、これは動的にリンクされたライブラリになります。静的ライブラリとどのようにリンクしますか?

20
agnul

CMakeでBUILD_SHARED_LIBSフラグをfalseに設定するだけで、静的なOpenCVライブラリを構築できます。次に、これらの静的ライブラリを使用して独自のアプリケーションを構築するために必要なのは、CMakeLists.txtにOpenCVへの依存関係を追加することだけです。

FIND_PACKAGE (OpenCV REQUIRED)
...
TARGET_LINK_LIBRARIES (your-application ${OpenCV_LIBS})

cMakeがすべてを処理します。

7
agnul

すべてを静的にリンクするには、CMAKE_EXE_LINKER_FLAGS-staticを追加)を探していると思います。

OpenCVConfig.cmakeの「シンプルな方法」を使用していますか?または古いFindOpenCV.cmake?

7
jkerian

実際、この問題はOpenCVに付属するOpenCVConfig.cmakeですでに修正されているようです。 OpenCV_STATICCMakeLists.txtを定義するだけです。つまり.

set(OpenCV_STATIC ON)
find_package(OpenCV REQUIRED)
6
bcook

AFAIKは少しトリッキーです。CMake、より正確にはfind_libraryコマンドは共有ライブラリを優先し、共有ライブラリと静的ライブラリの両方が利用可能な場合にそれらを見つけます。

「できるだけ静的」にバイナリをコンパイルできる優れたソリューションを私はまだ探していますが、エレガントなソリューションはまだ見つかりません。確実に機能する唯一の方法は、カスタムFindXXXXモジュールを介してすべてを実装することです。

4
pszilard

add_library行でstaticを指定します。 http://www.cmake.org/cmake/help/cmake-2-8-docs.html#command:add_library を参照してください

静的ライブラリに対してリンクしようとしているので、修正します CMAKE_FIND_LIBRARY_SUFFIXES プロパティを調べます

2
RobertJMaynard

--staticを渡すとgccはリンクを拒否しますですが、リンク引数に動的libがあることに注意してください-これは単にFindOpenCV.cmakeを使用するだけで動的ライブラリを取得する場合に発生します(ただし、OpenCVConfig.cmakeの動作はわかりません)...

1
pszilard
SET (CMAKE_EXE_LINKER_FLAGS "-static")
0
Li Gewei