Linuxで実行されているCMakeを使用してOpenCVベースのプロジェクトを構築しようとしています。これまでのところCMakeLists.txt
ファイルは次のようになります
FIND_PACKAGE (OpenCV REQUIRED)
...
TARGET_LINK_LIBRARIES (my-executable ${OpenCV_LIBS})
しかし、これは動的にリンクされたライブラリになります。静的ライブラリとどのようにリンクしますか?
CMakeでBUILD_SHARED_LIBS
フラグをfalseに設定するだけで、静的なOpenCVライブラリを構築できます。次に、これらの静的ライブラリを使用して独自のアプリケーションを構築するために必要なのは、CMakeLists.txt
にOpenCVへの依存関係を追加することだけです。
FIND_PACKAGE (OpenCV REQUIRED)
...
TARGET_LINK_LIBRARIES (your-application ${OpenCV_LIBS})
cMakeがすべてを処理します。
すべてを静的にリンクするには、CMAKE_EXE_LINKER_FLAGS
(-static
を追加)を探していると思います。
OpenCVConfig.cmakeの「シンプルな方法」を使用していますか?または古いFindOpenCV.cmake?
実際、この問題はOpenCVに付属するOpenCVConfig.cmake
ですでに修正されているようです。 OpenCV_STATIC
にCMakeLists.txt
を定義するだけです。つまり.
set(OpenCV_STATIC ON)
find_package(OpenCV REQUIRED)
AFAIKは少しトリッキーです。CMake、より正確にはfind_libraryコマンドは共有ライブラリを優先し、共有ライブラリと静的ライブラリの両方が利用可能な場合にそれらを見つけます。
「できるだけ静的」にバイナリをコンパイルできる優れたソリューションを私はまだ探していますが、エレガントなソリューションはまだ見つかりません。確実に機能する唯一の方法は、カスタムFindXXXXモジュールを介してすべてを実装することです。
add_library行でstaticを指定します。 http://www.cmake.org/cmake/help/cmake-2-8-docs.html#command:add_library を参照してください
静的ライブラリに対してリンクしようとしているので、修正します CMAKE_FIND_LIBRARY_SUFFIXES プロパティを調べます
--staticを渡すとgccはリンクを拒否しますですが、リンク引数に動的libがあることに注意してください-これは単にFindOpenCV.cmakeを使用するだけで動的ライブラリを取得する場合に発生します(ただし、OpenCVConfig.cmakeの動作はわかりません)...
SET (CMAKE_EXE_LINKER_FLAGS "-static")