使用第三方库不借助.cmake配置时如何确定需链接的lib文件
OpenCV手动链接时快速定位依赖库的高效方法
- 通过符号查找工具直接定位
遇到编译时undefined reference报错时,直接到OpenCV库文件存放目录下执行符号搜索命令即可快速匹配到对应的库:
执行后有输出的.so文件就是你需要链接的库,比如搜索# 带C++符号解析的搜索命令 nm -CD /path/to/opencv/lib/*.so | grep "报错的未定义函数名"cv::imread会匹配到libopencv_imgcodecs.so,直接在target_link_libraries里添加opencv_imgcodecs即可。 - 对照OpenCV官方模块命名规则直接匹配
OpenCV的库名和功能模块、头文件路径是严格对应的,常用模块对应关系如下:- 核心基础类型、数据结构:
opencv_core(对应头文件opencv2/core/*.hpp) - 图像读写编解码:
opencv_imgcodecs(对应头文件opencv2/imgcodecs.hpp) - 基础图像处理算法(滤波、几何变换等):
opencv_imgproc(对应头文件opencv2/imgproc.hpp) - GUI窗口、交互相关:
opencv_highgui(对应头文件opencv2/highgui.hpp) - 传统特征提取、匹配:
opencv_features2d(对应头文件opencv2/features2d.hpp) - 深度学习推理:
opencv_dnn(对应头文件opencv2/dnn.hpp) - 视频读写、编解码:
opencv_videoio(对应头文件opencv2/videoio.hpp) - 视频算法(光流、目标跟踪等):
opencv_video(对应头文件opencv2/video.hpp)
只要知道你用到的头文件属于哪个二级模块目录,直接拼接opencv_<模块名>就是对应的库名。
- 核心基础类型、数据结构:
- 临时调用find_package导出库列表
你可以临时写一个最简CMakeLists.txt:
执行cmake后输出的cmake_minimum_required(VERSION 3.10) project(temp) find_package(OpenCV REQUIRED) message(STATUS "OpenCV所有库列表:${OpenCV_LIBS}") message(STATUS "头文件路径:${OpenCV_INCLUDE_DIRS}")OpenCV_LIBS会完整列出当前版本所有OpenCV库的名称,你可以按需挑选,也可以直接把输出的所有库名复制到你手动链接的target_link_libraries中,不需要自己逐个查找。 - 通过报错信息前缀匹配
未定义函数的命名空间前缀已经指明了所属模块,比如cv::cuda::开头的函数都属于对应opencv_cuda*系列库,cv::ml::开头的属于opencv_ml,cv::xfeatures2d::属于扩展模块的opencv_xfeatures2d,直接根据前缀拼接即可。
小提示:不同版本OpenCV的部分功能归属可能有调整,比如3.x版本之前imread属于opencv_highgui,3.x之后移到了opencv_imgcodecs,用符号搜索的方法可以规避版本差异带来的错误。
内容的提问来源于stack exchange,提问作者Yacheng Liu
相关产品推荐
相关产品推荐

