注:原创不易,转载请务必注明原作者和出处,感谢支持!
一 因OpenCV版本不一致所引发的报错
今天遇到了一个很有意思的报错。
事情是这样的, 在编译《视觉SLAM十四讲》第12章的一个程序时,编译器报了“未定义的引用”的错误。该程序使用了DBoW3
这个库,而这个库又是依赖OpenCV
的。DBoW3
这个库经过编译之后会生成一个静态链接库并被安装在/usr/local/lib
路径下。
未定义的引用错误使我我意识到这是链接库出了问题。经过一番折腾,发现原因是这样的。我的虚拟机里安装的是最新的OpenCV 4.1.1
版本,但同时也安装了ROS
,而ROS
里自带了一个OpenCV 3.3.1
的版本。在编译DBoW3
库的时候,不知是何原因,cmake
搜索到的是3.3.1
版本的OpenCV
,因此DBoW3
的链接库链接的是3.3.1
版本的OpenCV
动态库。但是第12章里的程序所引用的却是4.1.1
版本的OpenCV
的头文件,所以在去链接DBoW3
的静态库的时候自然就报了未定义的引用的错误了。
于是,修改DBoW3
的CMakeLists.txt
文件,使用OpenCV 4.1.1
作为其依赖,重新编译并安装DBoW3
库,问题得以解决!
顺便再多啰嗦几句,我查看了cmake
的CMAKE_MODULE_PATH
变量的内容,发现它指向的路径是/usr/local/lib/cmake
和/usr/lib/cmake
,而这两个路径下是没有FindOpenCV.cmake
文件的,相反,OpenCV在安装时提供了OpenCVConfig.cmake
文件,该文件在/usr/local/lib/cmake/opencv4/
路径下。所以,你只需要在DBoW3
库的CMakeLists.txt
文件中指定OpenCV_DIR
为前面所提到的路径值即可。这样cmake
就能够找到4.1.1版本的OpenCV了。