双版本OpenCV共存时编译测试代码出现链接错误该如何解决
问题排查结果
核心报错原因
- OpenCV 3.x及以上版本已将
cv::imread、cv::imwrite等图像读写API从opencv_highgui模块迁移至独立的opencv_imgcodecs模块,你当前的链接命令仅指定了-lopencv_highgui,未链接opencv_imgcodecs,因此无法找到imread函数的实现符号,触发DSO missing报错。 - 额外补充:你用到的
cv::Mat等基础数据结构定义在opencv_core模块,实际链接时也需要补充该模块的链接参数。
解决方案
方案1:手动补充链接参数
直接修改链接阶段的命令,补充缺失的依赖库:
g++ cppopencv.o -L<mypath>/opencv/install4/lib/ -lopencv_highgui -lopencv_imgcodecs -lopencv_core -o cppopencv
如果你后续用到更多OpenCV功能,还需要对应添加-lopencv_imgproc、-lopencv_features2d等模块的链接参数。
方案2:使用pkg-config自动管理依赖(更适合多版本共存场景)
你编译OpenCV时已经开启了OPENCV_GENERATE_PKGCONFIG=ON参数,可以直接用pkg-config自动生成头文件和链接参数,避免手动漏加依赖:
- 先指定对应版本OpenCV的pkgconfig文件搜索路径(如果切换到OpenCV3,替换为install3对应的路径即可):
export PKG_CONFIG_PATH=<mypath>/opencv/install4/lib/pkgconfig:$PKG_CONFIG_PATH
- 直接用一行命令完成编译链接:
g++ cppopencv.cpp -o cppopencv $(pkg-config --cflags --libs opencv4) -std=c++11
运行时补充说明
如果运行二进制文件时提示找不到OpenCV动态库,可以先将对应版本的库路径添加到环境变量:
export LD_LIBRARY_PATH=<mypath>/opencv/install4/lib:$LD_LIBRARY_PATH
内容的提问来源于stack exchange,提问作者Artem Plyusnin
相关产品推荐
相关产品推荐

