通过cmake链接opencv库作为外部项目

Vya*_*lav 11 c++ opencv cmake static-linking

我对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} 
)
Run Code Online (Sandbox Code Playgroud)

所有构建得很好,我遇到问题的地方是我无法可靠地确定opencv库的位置.例如在linux/mac上有${MY_OPENCV_INSTALL_DIR}/lib并且被命名为,libopencv_core.a而在安装了VS 2012的32位Windows上,libs ${MY_OPENCV_INSTALL_DIR}/lib/x86/vc11/staticlib和Debug配置中的libs命名为opencv_core247d.lib.

所以问题是我可以以某种方式获取OpenCV构建(以及根lib文件夹)生成的所有库的列表,并通过类似的方式链接它们target_link_libraries(mylib opencv_core ...)吗?

也许我做错了什么或过于复杂.所以我基本上想要的是静态编译我的嵌入式opencv源代码树并以"跨平台"方式链接其库.

任何指针都非常感谢!谢谢!

max*_*int 21

将cmake与OpenCV项目一起使用的最佳解决方案是:

  1. 使用OpenCV的cmake构建系统将OpenCV编译为共享/静态库.
  2. 在您的项目的CMakeLists.txt中

例如(CMakeLists.txt):

project(test_project)

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})
add_executable(test main.cpp)
target_link_libraries(test ${OpenCV_LIBS})
Run Code Online (Sandbox Code Playgroud)

它适用于跨平台.

  • 谢谢!它已经给了我很好的见解.我只是想知道如何在不将OpenCV编译为单独步骤的情况下实现同样的目标,而是将所有内容集成到一个CMake项目中?谢谢! (2认同)