强制 cmake 使用特定的 OpenCV 版本

Forcing cmake to use a specific OpenCV version

我的 Ubuntu 14.04 默认安装了 OpenCV 2.4.8,我也有一个 cv::fisheye 类 需要的手工构建的 OpenCV 2.4.11,它我用 cmake 构建来生成我的可执行文件。问题是我正在使用 ROS,它也默认为 2.4.8,但我需要 link 与 2.4.11。我的技巧是:

find_package(OpenCV REQUIRED)
# Needed to force OpenCV 2.4 to link with 2.4.11
#message("Initial value for ${OpenCV_VERSION}: ${OpenCV_LIBS}")
if(OpenCV_VERSION VERSION_LESS "3.0")
  set(OpenCV_VERSIONED_LIBS "")
  macro(set_opencv_version version)
     foreach( LIB_FILE ${ARGN} )
         set(OpenCV_VERSIONED_LIBS ${OpenCV_VERSIONED_LIBS} :lib${LIB_FILE}.so.${version})
     endforeach()
  endmacro()
  set_opencv_version("2.4.11" ${OpenCV_LIBS})
else()
  set(OpenCV_VERSIONED_LIBS ${OpenCV_LIBS})
endif()
#message("Updated value: ${OpenCV_VERSIONED_LIBS}")

target_link_libraries(my_fisheye_application
  ${OpenCV_VERSIONED_LIBS}
  ${catkin_LIBRARIES}
  cv_bridge # This by default pulls in OpenCV 2.4.8 libraries
  # ...etc...
)

由于这个脚本需要在不同的机器上工作,并且需要使用 OpenCV 3.0 和 2.4.11,所以我不能对正在使用的目录做出任何假设。有更好的方法吗?

如果您想强制 CMake(FindOpenCV 模块)搜索不同于 package/system 安装的 OpenCV 库, 您需要将 OpenCV_ROOT_DIR 变量设置为要使用的 OpenCV 树的基目录。

另外,因为你至少需要一个特定的OpenCV库的最低版本,所以最好在find_package()函数中说明,如下:

find_package(OpenCV 2.4.11 REQUIRED)