pkg-config工具的使用

时间:2022-02-20 08:17:48

这两天一直opencv到ARM上,交叉编译的时候总提示找不到opencv的库,仔细的看了一下教程也没有什么头绪,最后把库文件挪来挪去无意之间成功了。兴奋啊,然后进行一个一个愿意排查,把这里的库删了看看行不,行的话就没关系,不行说明这里有影响


pkg-config工具

pkg-config程序是干什么用的?简单的说就是向用户向程序提供相应库的路径、版本号等信息的程序。譬如说我们运行以下命令:
pkg-config  查看gcc的CFLAGS参数
$pkg-config --libs --cflags arm-opencv   会显示如下信息:-I/usr/local/arm-opencv/include/opencv -I/usr/local/arm-opencv/include -L/usr/local/arm-opencv/lib -lopencv_videostab -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_ml -lopencv_video -lopencv_features2d -lopencv_calib3d -lopencv_objdetect -lopencv_contrib -lopencv_legacy -lopencv_flann -lopencv_gpu -lopencv_nonfree -lopencv_photo -lopencv_stitching -lopencv_ts
你看这不就是我们用gcc编译连接时CFLAGS的参数吗?因此当我们需要编译连接某个库时,我们只需要把上面那行加入gcc 的参数里面即可。这也是configure的作用,它会检查你需要的包,产生相应的信息。pkg-config从哪儿知道这些信息的呢?它是从包名为xxx.pc这个文件中查找到的。拿上面那个例子说,它是从arm-opencv.pc这个文件中查知的。pkg-config 又怎么会知道arm-opencv.pc这个文件呢?下面我们看一下pkg-config是怎样工作的。缺省情况下,pkg-config首 先在prefix/lib/pkgconfig/中查找相关包(譬如opencv)对应的相应的文件(opencv.pc)。在linux上上述路径名为 /usr/lib/pkconfig/。若是没有找到,它也会到PKG_CONFIG_PATH这个环境变量所指定的路径下去找。若是没有找到,它就会报 错,例如:Package opencv was not found in the pkg-config search path.
Perhaps you should add the directory containing `opencv.pc'
to the PKG_CONFIG_PATH environment variable
No package 'opencv' found

所以,首先你要告诉系统你的arm-opencv在哪里设置环境变量

编辑/etc/bash.bashrc文件。使用命令#vi /etc/bash.bashrc

在最后一行加入

PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/arm-opencv/pkgconfig

Export PKG_CONFIG_PATH

输入 #source /etc/bash.bashrc 这个配置信息就可以用了。或者,打开一个新终端,不用输入该命令,也可以使用到该配置信息。


================================================================
查看一个.pc文件的内容:
cat /usr/local/arm-opencv/pkgconfig/arm-opencv.pc 

#Package Information for pkg-config
prefix=/usr/local/arm-opencv
exec_prefix=${prefix}
libdir=${prefix}/lib
includedir_new=${prefix}/include/opencv
includedir_old=${prefix}/include
Name: arm-opencv
Description:Open Source Computer Vision Library for arm
Version:2.4.3

Cflags: -I${includedir_new} -I${includedir_old}
Libs: -L${exec_prefix}/lib -lopencv_videostab  -lopencv_core -lopencv_imgproc -lopencv_highgui    -lopencv_ml -lopencv_video -lopencv_features2d -lopencv_calib3d                -lopencv_objdetect -lopencv_contrib -lopencv_legacy -lopencv_flann             -lopencv_gpu  -lopencv_nonfree  -lopencv_photo -lopencv_stitching   -lopencv_ts 


可见.pc文件 是对其的库文件路径,头文件路径,版本号,Cflags等一些参数进行封装。

再来看看
 `pkg-config   --cflags   --libs  arm-opencv意思: 
`pkg-config   --cflags   --libs arm-opencv 是pkg-config从路径 /usr/local/arm-opencv/pkgconfig/arm-opencv.pc 中提取出来的用于编译用的。

最后要交叉编译在arm上运行的程序执行命令
#arm-linux-gcc `pkg-config --cflags arm-opencv` `pkg-config --libs arm-opencv` opencv_arm_test.c -lpthread -lrt -o opencv_arm_test