自定义路径下OpenCV依赖的CMakeLists.txt修改方法问询
问题
我正在构建一个依赖OpenCV的代码仓库,其CMakeLists.txt包含如下代码:
find_package(OpenCV 3.0 QUIET) if(NOT OpenCV_FOUND) find_package(OpenCV 2.4.3 QUIET) if(NOT OpenCV_FOUND) message(FATAL_ERROR "OpenCV > 2.4.3 not found.") endif() endif() # ... target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS} ${EIGEN3_LIBS} # ... )
当OpenCV安装在/usr/local/opencv时这段代码能正常工作,但我的Ubuntu 18.04机器上OpenCV位于自定义路径/usr/local/my_opencv/,构建时出现如下报错:
CMake Error at CMakeLists.txt:<line number> (message): OpenCV > 2.4.3 not found.
我的OpenCV目录结构如下:
milan@my_machine:/usr/local/my_opencv$ tree -L 5 . ├── bin │ ├── opencv_annotation │ └── ... ├── include │ └── opencv4 │ └── opencv2 │ ├── ... │ ├── core │ │ ├── ... │ │ ├── core_c.h │ │ ├── core.hpp │ │ └── ... │ ├── core.hpp │ ├── ... │ └── ... ├── lib │ ├── cmake │ │ └── opencv4 │ │ ├── OpenCVConfig.cmake │ │ └── ... │ ├── ... │ ├── libopencv_core.so -> libopencv_core.so.4.2 │ ├── libopencv_core.so.4.2 -> libopencv_core.so.4.2.0 │ ├── libopencv_core.so.4.2.0 │ ├── ... │ ├── opencv4 │ │ └── 3rdparty │ │ ├── ... │ │ └── ... │ ├── ... │ └── python3.6 │ └── dist-packages │ └── cv2 └── share ├── licenses │ └── opencv4 │ ├── ... │ └── ... └── opencv4 ├── ... │ └── ... ├── ... └── ...
请问需要修改CMakeLists.txt中的哪些内容才能解决该报错并完成构建?
解决方案
1. 告知CMake自定义OpenCV的配置路径
CMake依靠OpenCVConfig.cmake文件定位OpenCV,你的该文件位于/usr/local/my_opencv/lib/cmake/opencv4/。在find_package相关代码前添加以下内容,让CMake能找到这个文件:
# 指定OpenCV的配置目录 set(OpenCV_DIR "/usr/local/my_opencv/lib/cmake/opencv4/")
或者通过追加前缀路径的方式(更通用,不覆盖原有路径):
set(CMAKE_PREFIX_PATH "/usr/local/my_opencv/lib/cmake/opencv4/" ${CMAKE_PREFIX_PATH})
2. 简化版本检测逻辑(可选优化)
你的OpenCV是4.2版本,原代码的嵌套查找逻辑可以简化为直接指定最低版本要求,CMake会自动兼容3.x/4.x等更高版本:
# 直接查找版本>=2.4.3的OpenCV,替代原有嵌套判断 find_package(OpenCV 2.4.3 REQUIRED)
这样既保留了版本要求,又避免了冗余的条件判断。
3. 处理头文件路径(按需添加)
从目录结构看,OpenCV头文件在/usr/local/my_opencv/include/opencv4/opencv2/,如果后续编译出现头文件找不到的问题,可手动添加包含目录:
include_directories("/usr/local/my_opencv/include/opencv4/")
通常find_package成功后,OpenCV_INCLUDE_DIRS会自动包含正确路径,所以这一步多数情况不需要,但若出现编译报错可补充。
替代方案:构建时传递参数(无需修改CMakeLists.txt)
如果不想改动CMakeLists.txt,可在执行cmake命令时通过参数指定OpenCV路径:
cmake -DOpenCV_DIR=/usr/local/my_opencv/lib/cmake/opencv4/ ..
内容的提问来源于stack exchange,提问作者Milan
相关产品推荐
相关产品推荐

