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