如何通过pkg-config生成指定的OpenCV4链接库选项?
问题:如何用pkg-config仅生成所需的OpenCV链接库选项
我使用pkg-config --libs opencv4生成链接器选项时,会输出大量链接库(如下所示):
pkg-config --libs opencv4 -lopencv_gapi -lopencv_stitching -lopencv_alphamat -lopencv_aruco -lopencv_bgsegm -lopencv_ccalib -lopencv_cvv -lopencv_dnn_objdetect -lopencv_dnn_superres -lopencv_dpm -lopencv_face -lopencv_freetype -lopencv_fuzzy -lopencv_hdf -lopencv_hfs -lopencv_img_hash -lopencv_intensity_transform -lopencv_line_descriptor -lopencv_mcc -lopencv_ovis -lopencv_quality -lopencv_rapid -lopencv_reg -lopencv_rgbd -lopencv_saliency -lopencv_sfm -lopencv_stereo -lopencv_structured_light -lopencv_phase_unwrapping -lopencv_superres -lopencv_optflow -lopencv_surface_matching -lopencv_tracking -lopencv_highgui -lopencv_datasets -lopencv_text -lopencv_plot -lopencv_videostab -lopencv_videoio -lopencv_viz -lopencv_wechat_qrcode -lopencv_xfeatures2d -lopencv_shape -lopencv_ml -lopencv_ximgproc -lopencv_video -lopencv_xobjdetect -lopencv_objdetect -lopencv_calib3d -lopencv_imgcodecs -lopencv_features2d -lopencv_dnn -lopencv_flann -lopencv_xphoto -lopencv_photo -lopencv_imgproc -lopencv_core
但我只需要其中部分库,比如最后两个-lopencv_imgproc -lopencv_core。担心过长的链接选项会减慢链接阶段的速度,想请教如何使用pkg-config命令仅生成我所需的部分链接库?
我使用的是MSYS2/MinGW64平台,对应的opencv4.pc文件内容如下:
# Package Information for pkg-config prefix=/mingw64 exec_prefix=${prefix} libdir=${exec_prefix}/lib includedir=${prefix}/include/opencv4 Name: OpenCV Description: Open Source Computer Vision Library Version: 4.9.0 Libs: -L${exec_prefix}/lib -lopencv_gapi -lopencv_stitching -lopencv_alphamat -lopencv_aruco -lopencv_bgsegm -lopencv_ccalib -lopencv_cvv -lopencv_dnn_objdetect -lopencv_dnn_superres -lopencv_dpm -lopencv_face -lopencv_freetype -lopencv_fuzzy -lopencv_hdf -lopencv_hfs -lopencv_img_hash -lopencv_intensity_transform -lopencv_line_descriptor -lopencv_mcc -lopencv_ovis -lopencv_quality -lopencv_rapid -lopencv_reg -lopencv_rgbd -lopencv_saliency -lopencv_sfm -lopencv_stereo -lopencv_structured_light -lopencv_phase_unwrapping -lopencv_superres -lopencv_optflow -lopencv_surface_matching -lopencv_tracking -lopencv_highgui -lopencv_datasets -lopencv_text -lopencv_plot -lopencv_videostab -lopencv_videoio -lopencv_viz -lopencv_wechat_qrcode -lopencv_xfeatures2d -lopencv_shape -lopencv_ml -lopencv_ximgproc -lopencv_video -lopencv_xobjdetect -lopencv_objdetect -lopencv_calib3d -lopencv_imgcodecs -lopencv_features2d -lopencv_dnn -lopencv_flann -lopencv_xphoto -lopencv_photo -lopencv_imgproc -lopencv_core Libs.private: -lpthread Cflags: -I${includedir}
解决方案
方法1:过滤pkg-config输出
用grep筛选需要的库,同时保留必要的链接路径:
pkg-config --libs opencv4 | grep -E "(^-L|-lopencv_(core|imgproc))" | tr '\n' ' '
-E启用正则匹配,确保保留开头的-L路径选项,以及指定的两个库tr '\n' ' '把换行符换成空格,保证输出格式符合链接器要求
如果要避免误匹配类似opencv_corexxx的库,可添加单词边界限制:
pkg-config --libs opencv4 | grep -E "(^-L|-lopencv_core\b|-lopencv_imgproc\b)" | tr '\n' ' '
方法2:修改本地opencv4.pc文件
直接编辑MSYS2下的/mingw64/lib/pkgconfig/opencv4.pc,将Libs行里不需要的库删除,只保留需要的:
Libs: -L${exec_prefix}/lib -lopencv_imgproc -lopencv_core
注意:这种修改是全局的,会影响所有使用该pc文件的项目。如果只想针对单个项目生效,可以复制一份pc文件到项目目录,修改后设置环境变量指定路径:
export PKG_CONFIG_PATH=/path/to/your/project:$PKG_CONFIG_PATH
方法3:直接指定链接库
如果只需要少数几个库,完全可以跳过pkg-config,直接在编译命令中写链接选项:
g++ your_code.cpp -o your_program -I/mingw64/include/opencv4 -L/mingw64/lib -lopencv_core -lopencv_imgproc
关于链接速度的说明
其实链接器(如ld)会自动忽略未被代码引用的库,所以即使传入所有库,实际链接时并不会处理未用到的部分,速度影响不会像你担心的那么大。但如果确实需要精简,上面的方法都可以实现。
内容的提问来源于stack exchange,提问作者ollydbg
相关产品推荐
相关产品推荐

