写在前面
自己的测试环境:
Ubuntu20.04, ROS-Noetic, OpenCV-4.2.0, OpenCV-4.5.4。
注意:
自己电脑安装了两个OpenCV
:OpenCV-4.2.0
和OpenCV-4.5.4
.
OpenCV-4.2.0
是二进制安装的:在Ubuntu20.04
的环境下,安装ROS-Noetic
时,执行指令sudo apt-get install ros-noetic-desktop-full
的同时会安装OpenCV-4.2.0
,(也就是相当于二进制方式安装了OpenCV-4.2.0
),其头文件会被安装在/usr/include/opencv4/opencv2/
,库文件会被安装在/usr/lib/x86_64-linux-gnu/
。OpenCV-4.5.4
是源码安装的:从github
上下载OpenCV-4.5.4
,然后在build/
下执行cmake.. ; make; sudo make install
下列指令进行安装。其头文件会被安装在/usr/local/include/opencv4/opencv2/
,库文件会被安装在/usr/local/lib/
。
一、问题描述
编译运行某一个程序时需要 OpenCV-4.2
,所以,在该程序的 CMakeLists.txt
中指定了OpenCV-4.2.0
. 即在 CMakeLists.txt
中写入如下程序:
set(OpenCV_DIR /usr/lib/x86_64-linux-gnu/cmake/opencv4/)
find_package(OpenCV REQUIRED)
message("OpenCV_DIR: ${OpenCV_DIR}")
message("OpenCV_INCLUDE_DIRS: ${OpenCV_INCLUDE_DIRS}")
message("OpenCV version: ${OpenCV_VERSION}")
# 打印结果
# OpenCV_DIR: /usr/lib/x86_64-linux-gnu/cmake/opencv4/
# OpenCV_INCLUDE_DIRS: /usr/include/opencv4
# OpenCV version: 4.2.0
根据打印结果发现${OpenCV_INCLUDE_DIRS}
是对的,${OpenCV_VERSION}
的库版本是对的,编译该程序时,确实使用了 OpenCV-4.2.0
,但是编译时出现如下报错:
make[2]: *** No rule to make target '/usr/lib/x86_64-linux-gnu/libopencv_dpm.s', needed by '/home/wong/test_ws/devel/lib/package_slam/slam_node'. Stop
二、解决方法
出现上述报错的原因是找不到 libopencv_dpm.s
。因此,自己在电脑上搜索,确实没有libopencv_dpm.s
,但是搜索到了 libopencv_dpm.so
, 因此考虑可能是链接库写错了。
所以做如下修改:
在cv_bridgeConfig.cmake
的 109
行 将下列语句:
set(libraries "cv_bridge;/usr/lib/x86_64-linux-gnu/libopencv_calib3d.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_dnn.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_features2d.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_flann.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_highgui.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_ml.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_objdetect.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_photo.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_stitching.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_video.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_videoio.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_aruco.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_bgsegm.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_bioinspired.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_ccalib.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_datasets.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_dnn_objdetect.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_dnn_superres.so.4.2.0;/usr/lib/x86_64-linux-gnu/libopencv_dpm.s")
这个语句中的 /usr/lib/x86_64-linux-gnu/libopencv_dpm.s
修改为
/usr/lib/x86_64-linux-gnu/libopencv_dpm.so.4.2.0
然后再次编译,即可解决问题。
参考链接
[1] wonghome. “电脑安装了两个OpenCV, CMakeLists.txt 指定了其中一个版本OpenCV进行编译程序, 编译通过但运行会报OpenCV库函数的错误“ 的参考解决方法 [EB/OL]. https://blog.csdn.net/qq_39779233/article/details/140325790, 2024-08-03/2024-09-13.