这两天一直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