作者:Sam (甄峰) sam_code@hotmail.com
在研究autoconf时,必然要研究到pkg-config,它非常好用。在x86-64系统下能极大的方便编译。但Sam一直没有找到它在交叉编译时该如何正确的起作用。这次就探讨一下。
1.
pkg-config基本作用和用法:
1.1: 背景:
很多软件包会被其它程序使用,在此过程中,需要指定头文件位置,库文件,库文件位置等信息。如果单纯手写如下: -I/usr/include/
-lglib -L/usr/lib/ 其一是容易出错,另外,很多包在yum install,
apt-get install后头文件和库文件的位置,和使用源码编译,make;make install
的位置也并不一定一致。再加上还有版本问题。所以就有了pkg-config.
pkg-config主要作用是:
- 检查库的版本号。如果所需要的库的版本不满足要求,它会打印出错误信息,避免链接错误版本的库文件。
- 获得编译预处理参数,如宏定义,头文件的位置。
- 获得链接参数,如库及依赖的其它库的位置,文件名及其它一些连接参数。
- 自动加入所依赖的其它库的设置。
1.2:使用方法:
先介绍一个特殊文件 *.pc.
它将描述头文件,库文件所在位置,版本号等具体信息。pkg-config就是通过它得到以上信息的。那它具体放在哪里呢,yum
install, apt-get install,make install 通常会把这个文件放到/usr/lib/pkgconfig
, /usr/local/lib/pkgconfgig,
usr/lib64/pkgconfig等位置。但pkg-config如何知道此文件的位置呢? PKG_CONFIG_PATH
例:
export
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig/
指明pc文件被放到了哪个目录。
具体使用:
Sam机器上的glib-2.0版本为:Version: 2.51.4(pc文件中所描写)
$pkg-config "glib-2.0 >
2.49.1" --cflags
结果是:
-I/usr/local/include/glib-2.0
-I/usr/local/lib/glib-2.0/include
$pkg-config "glib-2.0 > 2.49.1"
--libs
结果是:
-L/usr/local/lib -lglib-2.0
$pkg-config "glib-2.0 > 2.49.1" --libs --cflags
结果是:
-I/usr/local/include/glib-2.0
-I/usr/local/lib/glib-2.0/include -L/usr/local/lib
-lglib-2.0
但如果版本不对呢?
$pkg-config "glib-2.0 >
2.54.1" --libs --cflags
则显示如下:
Requested 'glib-2.0 > 2.54.1' but version of GLib is
2.51.4
2. 交叉编译处理方式1: