2.2.10 封装“交叉”pkg-config
在GNU中大部分的软件都使用Autoconf配置,Autoconf通常借助工具pkg-config去获取将要编译的程序依赖的共享库的一些信息,比如库的头文件存放在哪个目录下,共享库存放在哪个目录下以及链接哪些共享库等,我们将其称为库的元信息。通常,这些信息都被保存在一个以软件包的名称命名,并以".pc"作为扩展名的文件中。而pkg-config会到特定的目录下寻找这些pc文件,一般而言,其首先搜索环境变量PKG_CONFIG_PATH指定的目录,然后搜索默认路径,一般是/usr/lib/pkgconfig、/usr/share/pkgconfig、/usr/local/lib/pkgconfig等。显然,使用环境变量PKG_CONFIG_PATH不能满足我们的要求。因为在交叉编译环境中,我们是不能允许正在编译的程序链接到宿主系统的库上的,也就是说,我们除了告诉pkg-config到目标系统的文件系统中寻找外,还要禁止它搜索默认的宿主系统的路径。而另外一个环境变量PKG_CONFIG_LIBDIR可以满足我们这个需求,一旦设置了PKG_CONFIG_LIBDIR,其将取代pkg-config默认的搜索路径。因此,在交叉编译时,这两个变量的设置如下:
注意 如果需要重新构建交叉编译工具链,在构建前,也需要注释掉此处的变量定义,在构建完成工具链后再重新启用这里的变量定义。
除了pkg-config寻找pc文件的搜索路径需要调整外,从pc文件中获取的cflags和libs也需要追加sysroot作为前缀。因此,这里我们包装一下host系统的pkg-config,将为交叉编译定制的pkg-config放在$SYSROOT/bin下。
并为pkg-config增加执行权限:
下面是宿主系统自身的pkg-config获得的libmount库的—cflags和—libs:
下面是经过我们包装的pkg-config得的libmount库的—cflags和—libs:
显然,经过我们包装的pkg-config不再到宿主系统的文件系统下寻找依赖的库,而是到目标系统的根文件系统下去寻找依赖的共享库及头文件等。