什么是pkg-config?为什么使用pkg-config?

什么是pkg-configpkg-config是一个linux下的命令,用于获得某一个库/模块的所有编译相关的信息,使用这个工具,我们可以很方便地编译一个项目。
为什么使用pkg-config在linux中,经常会安装很多第三方的模块,我们在编译链接他们的时候需要制定头文件、库文件的位置,以及库文件的名字等等。
就以opencv为例子,如果我们用g++编译,就需要指定头文件库文件的相关信息,但是因为opencv依赖的库文件很多,我们指定的时候需要链接很多库,这就很麻烦了,比如
g++ displayimage.cpp -i/usr/local/include/opencv4/opencv -i/usr/local/include/opencv4 -l/usr/local/lib -lopencv_gapi -lopencv_stitching -lopencv_aruco -lopencv_bgsegm -lopencv_bioinspired -lopencv_ccalib -lopencv_cudabgsegm -lopencv_cudafeatures2d -lopencv_cudaobjdetect -lopencv_cudastereo -lopencv_dnn_objdetect -lopencv_dnn_superres -lopencv_dpm -lopencv_highgui -lopencv_face -lopencv_freetype -lopencv_fuzzy -lopencv_hfs -lopencv_img_hash -lopencv_line_descriptor -lopencv_quality -lopencv_reg -lopencv_rgbd -lopencv_saliency -lopencv_stereo -lopencv_structured_light -lopencv_phase_unwrapping -lopencv_superres -lopencv_cudacodec -lopencv_surface_matching -lopencv_tracking -lopencv_datasets -lopencv_text -lopencv_dnn -lopencv_plot -lopencv_videostab -lopencv_cudaoptflow -lopencv_optflow -lopencv_cudalegacy -lopencv_videoio -lopencv_cudawarping -lopencv_xfeatures2d -lopencv_shape -lopencv_ml -lopencv_ximgproc -lopencv_video -lopencv_xobjdetect -lopencv_objdetect -lopencv_calib3d -lopencv_imgcodecs -lopencv_features2d -lopencv_flann -lopencv_xphoto -lopencv_photo -lopencv_cudaimgproc -lopencv_cudafilters -lopencv_imgproc -lopencv_cudaarithm -lopencv_core -lopencv_cudev用pkg-config就可以解决这个问题,使用很简单:
g++ displayimage.cpp $(pkg-config --cflags --libs opencv4)其实就是用pkg-config --cflags --libs opencv4这个命令代替了-i -l -lxxx.so等指令。
其实构建opencv项目还有一种方法是cmake,关于cmake的使用方法,我们以后再介绍。
怎么使用pkg-config这篇文建是就是根据官方文档介绍写的,大家以后需要安装什么模块,查看使用方法的,尽量都去官网看一看。
pc文件pkg-config读后缀为pc的配置文件的,pkg-config怎么知道pc文件在哪呢?有两个方法
1 官网中这样说的
on a typical unix system, it will search in the directories /usr/lib/pkgconfig and /usr/share/pkgconfig
所以pc文件的路径就在
/usr/lib/pkgconfig/usr/share/pkgconfig 这两个目录下。2 第二种就是修改pkg_config_path环境变量,将pc文件的路径添加到这个环境变量中
我们可以执行pkg-config --variable pc_path pkg-config来查看当前pkg-config会搜索的路径
示例接下来我们以opencv4.pc来简单介绍下。
# package information for pkg-configprefix=/usr/localexec_prefix=${prefix}libdir=${exec_prefix}/libincludedir_old=${prefix}/include/opencv4/opencvincludedir_new=${prefix}/include/opencv4name: opencvdescription: open source computer vision libraryversion: 4.2.0libs: -l${exec_prefix}/lib -lopencv_gapi -lopencv_stitching -lopencv_aruco -lopencv_bgsegm -lopencv_bioinspired -lopencv_ccalib -lopencv_cudabgsegm -lopencv_cudafeatures2d -lopencv_cudaobjdetect -lopencv_cudastereo -lopencv_dnn_objdetect -lopencv_dnn_superres -lopencv_dpm -lopencv_highgui -lopencv_face -lopencv_freetype -lopencv_fuzzy -lopencv_hfs -lopencv_img_hash -lopencv_line_descriptor -lopencv_quality -lopencv_reg -lopencv_rgbd -lopencv_saliency -lopencv_stereo -lopencv_structured_light -lopencv_phase_unwrapping -lopencv_superres -lopencv_cudacodec -lopencv_surface_matching -lopencv_tracking -lopencv_datasets -lopencv_text -lopencv_dnn -lopencv_plot -lopencv_videostab -lopencv_cudaoptflow -lopencv_optflow -lopencv_cudalegacy -lopencv_videoio -lopencv_cudawarping -lopencv_xfeatures2d -lopencv_shape -lopencv_ml -lopencv_ximgproc -lopencv_video -lopencv_xobjdetect -lopencv_objdetect -lopencv_calib3d -lopencv_imgcodecs -lopencv_features2d -lopencv_flann -lopencv_xphoto -lopencv_photo -lopencv_cudaimgproc -lopencv_cudafilters -lopencv_imgproc -lopencv_cudaarithm -lopencv_core -lopencv_cudevlibs.private: -lm -lpthread -lcudart_static -ldl -lrt -lnppc -lnppial -lnppicc -lnppicom -lnppidei -lnppif -lnppig -lnppim -lnppist -lnppisu -lnppitc -lnpps -lcublas -lcudnn -lcufft -l-l/usr/local/cuda -llib64 -l-l/usr/lib -lx86_64-linux-gnucflags: -i${includedir_old} -i${includedir_new}1 参数说明
name:模块的名字opencv,注意,pkg-config是按照文件名字来查找,和这儿的name无关description:简单的描述version:模块的版本信息libs:模块依赖的lib的信息libs.private:木块需要但是并未公开出炉的链接库cflags:模块的编译器标志2 执行
$ pkg-config --modversion opencv44.2.0$ pkg-config --cflags opencv4-i/usr/local/include/opencv4/opencv -i/usr/local/include/opencv4$ pkg-config --libs opencv4-l/usr/local/lib -lopencv_gapi -lopencv_stitching -lopencv_aruco -lopencv_bgsegm -lopencv_bioinspired -lopencv_ccalib -lopencv_cudabgsegm -lopencv_cudafeatures2d -lopencv_cudaobjdetect -lopencv_cudastereo -lopencv_dnn_objdetect -lopencv_dnn_superres -lopencv_dpm -lopencv_highgui -lopencv_face -lopencv_freetype -lopencv_fuzzy -lopencv_hfs -lopencv_img_hash -lopencv_line_descriptor -lopencv_quality -lopencv_reg -lopencv_rgbd -lopencv_saliency -lopencv_stereo -lopencv_structured_light -lopencv_phase_unwrapping -lopencv_superres -lopencv_cudacodec -lopencv_surface_matching -lopencv_tracking -lopencv_datasets -lopencv_text -lopencv_dnn -lopencv_plot -lopencv_videostab -lopencv_cudaoptflow -lopencv_optflow -lopencv_cudalegacy -lopencv_videoio -lopencv_cudawarping -lopencv_xfeatures2d -lopencv_shape -lopencv_ml -lopencv_ximgproc -lopencv_video -lopencv_xobjdetect -lopencv_objdetect -lopencv_calib3d -lopencv_imgcodecs -lopencv_features2d -lopencv_flann -lopencv_xphoto -lopencv_photo -lopencv_cudaimgproc -lopencv_cudafilters -lopencv_imgproc -lopencv_cudaarithm -lopencv_core -lopencv_cudev最后再来看一下编译的指令,是不是就简单了呢


小米6X发布,雷军宣布重大决定
科技演绎经典腕表工艺 vivo WATCH智能手表全面开售
第20届深圳机械展启幕,今年有哪些亮点值得观看?
无线感测器节点的类比关键
3M公司提高中国嵌入电容器材料生产能力
什么是pkg-config?为什么使用pkg-config?
53148A/Agilent53148A功率计参数说明
日企聚焦GaN功率元件,耐压600V产品成主流
高智能肥料养分检测仪功能介绍
隔离宽电压高电压稳压升压模块的特点及应用
半导体行业的Fabless和IDM两种模式
怎样可以成为大数据领域的领头羊
igbt内部结构及工作原理分析
电气火灾监控系统的设置,它的操作要求是什么
蔡浩轩:影响比特币决定因素有哪些?
什么是汽车自适应巡航控制系统
立柱机器人码垛机在食品行业的应用
达尔优春季新品A104全插拔机械键盘,行乐须及春
无人机里的note7?GoPro无人机Karma上市仅16天电池故障召回!
JEDEC将扩展应用制定固态硬盘标准