web-dev-qa-db-ja.com

cmakeを介して外部プロジェクトとして含まれているopencvライブラリをリンクする

私は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ソースツリーを静的にコンパイルし、そのライブラリに対して「クロスプラットフォーム」の方法でリンクすることです。

どんなポインタも大歓迎です!ありがとう!

11
Vyacheslav

OpenCVプロジェクトでcmakeを使用するための最良の解決策は次のとおりです。

  1. OpenCVのcmakeビルドシステムを使用して、OpenCVを共有/静的ライブラリとしてコンパイルします。
  2. プロジェクトのCMakeLists.txt内

例(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})

クロスプラットフォームで動作します。

21
maxint