pkg-config学习

转自:pkg-config的用法

pkg-config使用


#pkg-config  添加opencv
# add open CV
unix {
    CONFIG += link_pkgconfig
    PKGCONFIG += opencv
}

pkg-config  查看gcc的CFLAGS参数

$ pkg-config --libs --cflags opencv
会显示如下信息:
-I/usr/include/opencv -lcxcore -lcv -lhighgui -lcvaux
各位看官,你看这不就是我们用gcc编译连接时CFLAGS的参数吗?
因此当我们需要编译连接某个库时,我们只需要把上面那行加入gcc 的参数里面即可。
这也是configure的作用,它会检查你需要的包,产生相应的信息。
pkg-config从哪儿知道这些信息的呢?它是从包名为xxx.pc这个文件中查找到的。拿上面那个例子说,它是从opencv.pc这个文件中查知的。
pkg-config 又怎么会知道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


#查看  PKG_CONFIG_PATH 路径

yhzhao@yhzhao:~$ echo $PKG_CONFIG_PATH
/home/yhzhao/slam_ws/devel/lib/pkgconfig:/home/yhzhao/slam_ws/devel/lib/x86_64-linux-gnu/pkgconfig:
/home/yhzhao/hl_ws/devel/lib/x86_64-linux-gnu/pkgconfig:/home/yhzhao/catkin_ws/devel/lib/x86_64-linux-gnu/pkgconfig:
/opt/ros/indigo/lib/x86_64-linux-gnu/pkgconfig:/home/yhzhao/hl_ws/devel/lib/pkgconfig:
/home/yhzhao/catkin_ws/devel/lib/pkgconfig:/opt/ros/indigo/lib/pkgconfig

 yhzhao@yhzhao:~$ 



设置环境变量PKG_CONFIG_PATH方法举例如下:
export PKG_CONFIG_PATH=/cv/lib:$PKG_CONFIG_PATH




1 pkg-config程序是干什么用的?

        简单的说就是向用户向程序提供相应库的路径、版本号等信息的程序。典型的是用作库的编译和连接

pkg-config --list-all    可以列出所有可使用的包。
   $pkg-config --list-all |grep gtk (查看是否安装了gtk)

pkg-config要求库提供一个.pc元数据文件,从这些文件中检索库的各种必要信息,包括版本信息,编译和连接需要的参数等。这些信息可以通过pkg-config提供的参数(如--cflags, --libs)单独提取出来直接供编译器和连接器使用。


默认情况下,每个支持pkg-config的库对应的.pc文件,在安装后,都位于目录/usr/lib/pkgconfig目录下。


环境变量PKG_CONFIG_PATH是用来设置.pc文件的搜索路径的,pkg-config按照设置路径的先后顺序进行搜索。这样,库的头文件的搜索路径的设置实际上就变成了对.pc文件搜索路径的设置。


2 pkg-config功能

一般来说,即使是使用同一个库,不同的用户在安装时也可能会安装在不同的目录下。这样在编译时使用-I参数指定include路径,在连接时使用-L参数指定lib库的路径,可能造成了编译,连接的不一致,同一份程序从一台机器copy到另一台机器时就可能会出现问题。

pkg-config就是用来解决编译连接界面不统一问题的一个工具。

它的基本思想:事先把库的各种必要信息保存在.pc文件中,需要的时候可以使用参数(--cflags,--libs),将所需信息提取出来供编译和连接使用。这样,不管库文件安装在哪,通过库对应的.pc文件就可以准确定位,可以使用相同的编译和连接命令,使得编译和连接界面统一。

它提供的主要功能有:
<1> 检查库的版本号。如果所需库的版本不满足要求,打印出错误信息,避免连接错误版本的库文件。
<2> 获得编译预处理参数,如宏定义,头文件的路径。
<3> 获得编译参数,如库及其依赖的其他库的位置,文件名及其他一些连接参数。
<4> 自动加入所依赖的其他库的设置。

3 gtk+-2.0的.pc文件内容举例

prefix=/usr

exec_prefix=/usr

libdir=/usr/lib

includedir=/usr/include

target=x11


gtk_binary_version=2.4.0

gtk_host=i386-redhat-linux-gnu


Name: GTK+

Description: GIMP Tool Kit (${target} target)

Version: 2.6.7

Requires: gdk-${target}-2.0 atk

Libs: -L${libdir} -lgtk-${target}-2.0

Cflags: -I${includedir}/gtk-2.0



如果要使用gtk+的库编译一个程序,可以如下:

$gcc -c program.c -o program `pkg-config "gtk+-2.0>2.0.0" --cflags --libs`

其中,--cflags参数提取出编译所需的选项,--libs参数提取出连接时的选项。上面一步也可以分成两步如下
$gcc -c program.c `pkg-config --cflags "gtk+-2.0>2.0.0"`

$gcc -o program program.o `pkg-config --libs "gtk+-2.0>2.0.0"`

4 环境变量PKG_CONFIG_PATH

在安装完一个需要使用的库后,比如Glib,一是将相应的.pc文件,如glib-2.0.pc拷贝到/usr/lib/pkgconfig目录下,二是通过设置环境变量PKG_CONFIG_PATH添加glib-2.0.pc文件的搜索路径。

尤其是不完全使用新安装的库取代旧库的时候,使用环境变量可能是更好的选择,因为环境窗口的设置只对当前终端窗口有效。

使用环境变量的方法,只需修改PKG_CONFIG_PATH和LD_LIBRARY_PATH变量。LD_LIBRARY_PATH变量主要是添加新安装库的搜索路径。

如新的Glib库安装在/usr/local/glib-2.0/lib下,可以编辑文件set_glib-2.0:
export PKG_CONFIG_PATH=/usr/local/lib/glib-2.0/lib/pkgconfig:$PKG_CONFIG_PATH

export LD_LIBRARY_PATH=/usr/local/lib/glib-2.0/lib:$LD_LIBRARY_PATH
每次使用时,source下就行了:
$source set_glib-2.0
5 其他的config
$ls /usr/bin/*config



pkg-config有四个命令来查询gtk的安装情况 地址:PKG_CONFIG_PATH和PKG_CONFIG的路径设置问题

     $pkg-config --modversion gtk+    (查看1.2.x版本)

     $pkg-config --modversion gtk+-2.0  (查看 2.x 版本)

     $pkg-config --version (查看pkg-config的版本)

     $pkg-config --list-all |grep gtk (查看是否安装了gtk)

    我输入pkg-config --modversion gtk+-2.0,提示找不到xproto.pc文件,需要把包含该文件的目录放到PKG_CONFIG_PATH里,搜索了一下,该文件在/usr/share/pkgconfig下,于是更改环境变量成:
     export PKG_CONFIG=/usr/local/bin/pkg-config
     export PKG_CONFIG_PATH=/usr/share/pkgconfig:/usr/lib/pkgconfig
     记住:两个路径之间用 ':' 隔开,不是 ',', 或者 ';'。不让会出大问题。


参考:
1. ld.so.conf 文件与PKG_CONFIG_PATH变量,http://www.91linux.com/html/article/program/cpp/20071207/8934.html

2. Makefile好助手:pkgconfig, http://blog.mcuol.com/User/AT91RM9200/Article/7457_1.htm
3. pkg-config使用,http://blog.chinaunix.net/u/12467/showart_246860.html





你可能感兴趣的:(【compiling】,【QT】)