当程序依赖的外部库文件和头文件相对比较多时,每次建立工程都需要对这些库文件进行配置,这个过程比较繁琐,所以pkg-config工具包被开发出来,解决这一个问题。本文主要介绍如何使用pkg-config工具包,并给出opencv和Armadillo软件库才用pkg-config配置的例子。本文实在ubuntu14.04的基础上进行测试。
1. 安装pkg-config工具包
如果ubuntu系统中没有pkg-config工具包,可以通过下面的代码进行安装
sudo apt-get install pkg-config
2.设置pkg-config系统环境变量
打开/etc/bash.bashrc文件,在最后加入
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig系统开机后/etc/bash.bashrc文件中的信息会自动被系统检测,PKG_CONFIG_PATH会自动加入到系统变量中
export PKG_CONFIG_PATH
上面的路径/usr/local/lib/pkgconfig 是存放opencv.pc和armadillo.pc等类似配置文件的地方。这样pkg-config才能够正确的找到相关库文件的配置信息。
3. opencv.pc文件解析
# Package Information for pkg-config上面的文件是ubuntu中 安装 opencv库后自动生成的文件,其中Libs标号后面给出了opencv常用的库文件信息。Cflags标号后面给出opencv的头文件路径信息
prefix=/usr/local
exec_prefix=${prefix}
libdir=
includedir_old=${prefix}/include/opencv
includedir_new=${prefix}/include
Name: OpenCV
Description: Open Source Computer Vision Library
Version: 2.4.10
Libs: ${exec_prefix}/lib/libopencv_calib3d.so ${exec_prefix}/lib/libopencv_contrib.so ${exec_prefix}/lib/libopencv_core.so
${exec_prefix}/lib/libopencv_features2d.so ${exec_prefix}/lib/libopencv_flann.so ${exec_prefix}/lib/libopencv_gpu.so
${exec_prefix}/lib/libopencv_highgui.so ${exec_prefix}/lib/libopencv_imgproc.so ${exec_prefix}/lib/libopencv_legacy.so
${exec_prefix}/lib/libopencv_ml.so ${exec_prefix}/lib/libopencv_nonfree.so ${exec_prefix}/lib/libopencv_objdetect.so
${exec_prefix}/lib/libopencv_ocl.so ${exec_prefix}/lib/libopencv_photo.so ${exec_prefix}/lib/libopencv_stitching.so
${exec_prefix}/lib/libopencv_superres.so ${exec_prefix}/lib/libopencv_ts.a ${exec_prefix}/lib/libopencv_video.so
${exec_prefix}/lib/libopencv_videostab.so -lrt -lpthread -lm -ldl
Cflags: -I${includedir_old} -I${includedir_new}# Package Information for pkg-config
在每次编译使用了opencv库的工程时可以执行下面的代码:
g++ main.cpp -o main `pkg-config --cflags --libs opencv`
4.编写armadillo.pc文件
仿照opencv.pc文件,这里编写了armadillo.pc,并将其复制到/usr/local/lib/pkgconfig目录下,这样就可以使用pkg-config工具编译使用了armadillo库的工程。
#Package Information for pkg-config
prefix=/usr/local
exec_prefix=${prefix}
libdir=${prefix}/lib
includedir=${prefix}/include/armadillo
Name: armadillo
Description: C++ linear algebra library
Version: 6.100.0
Libs: -L${libdir} -larpack -llapack -lopenblas -lf2c -lgfortran
Cflags: -I${includedir}
如果一个工程即使用了opencv也使用 armadillo,编译时只要才用下面代码即可, 使用很方便。
g++ globalPb.cpp -o globalPb -O2 `pkg-config --cflags --libs opencv armadillo`
5.总结
使用pkg-config工具包可以方便工程使用多种库文件时的编译工作。只需编写好每个库的.pc文件,并复制到PKG_CONFIG_PATH环境变量制定的目录,并可以正常使用。