私はcmakeに比較的慣れておらず、何日も苦労した後、次のことを理解できませんでした。
Opencv(それ自体がcmakeプロジェクト)に依存するプロジェクトがあり、opencvライブラリを静的にリンクしたいと思います。私がやっていることは、プロジェクトにopencvソースコードのコピーがあり、それをCMakeLists.txtに含めることです。
ExternalProject_Add(my_copy_of_opencv_project
CMAKE_ARGS -D BUILD_SHARED_LIBS=NO ...
CMAKE_INSTALL_PREFIX=${MY_OPENCV_INSTALL_DIR}
SOURCE_DIR ${PATH_TO_OPENCV_SRCS}
)
すべてうまく構築されており、私が問題を抱えているのは、opencvライブラリがどこにあるかを確実に判断できないことです。例えば。 linux/macでは${MY_OPENCV_INSTALL_DIR}/lib
にあり、libopencv_core.a
という名前が付けられていますが、VS 2012がインストールされている32ビットWindowsでは、ライブラリは${MY_OPENCV_INSTALL_DIR}/lib/x86/vc11/staticlib
にあり、デバッグ構成ではopencv_core247d.lib
のような名前が付けられています。
だから問題は、OpenCVビルド(およびルートlibフォルダー)によって生成されたすべてのライブラリのリストを取得し、target_link_libraries(mylib opencv_core ...)
のようなものを介してそれらをリンクできるかどうかです。
多分私は何か間違っているか、過度に複雑にしています。したがって、私が基本的に望んでいるのは、埋め込まれたopencvソースツリーを静的にコンパイルし、そのライブラリに対して「クロスプラットフォーム」の方法でリンクすることです。
どんなポインタも大歓迎です!ありがとう!
OpenCVプロジェクトでcmakeを使用するための最良の解決策は次のとおりです。
例(CMakeLists.txt):
cmake_minimum_required(VERSION 2.8.12)
project(test_project)
# OpenCV_DIR could also be read from system environment variable.
if(WIN32)
set(OpenCV_DIR "d:/libs/opencv-2.4.8/build")
else()
set(OpenCV_DIR "/usr/lib/opencv")
endif()
find_package(OpenCV REQUIRED COMPONENTS core imgproc highgui)
include_directories(${OpenCV_INCLUDE_DIRS}) # not needed for opencv>=4.0
add_executable(test main.cpp)
target_link_libraries(test ${OpenCV_LIBS})
クロスプラットフォームで動作します。