读书频道 > 系统 > linux > 深度探索Linux操作系统系统构建和原理解析
2.2.10 封装“交叉”pkg-config
2013-09-28 14:57:22     我来说两句 
收藏    我要投稿   
全书一共8章:第1章介绍了如何准备工作环境。在第2章中构建了编译工具链,这是后面构建操作系统各个组件的基础。在这一章中,不仅详细讲解了工具链的构建过程,而且还通过对编译链接过程的探讨,深入讨论了工具链  立即去当当网订购

在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默认的搜索路径。因此,在交叉编译时,这两个变量的设置如下:
/home/vita/.bashrc
unset PKG_CONFIG_PATH
export PKG_CONFIG_LIBDIR=$SYSROOT/usr/lib/pkgconfig:\
    $SYSROOT/usr/share/pkgconfig

注意 如果需要重新构建交叉编译工具链,在构建前,也需要注释掉此处的变量定义,在构建完成工具链后再重新启用这里的变量定义。

除了pkg-config寻找pc文件的搜索路径需要调整外,从pc文件中获取的cflags和libs也需要追加sysroot作为前缀。因此,这里我们包装一下host系统的pkg-config,将为交叉编译定制的pkg-config放在$SYSROOT/bin下。
/vita/cross-tool/bin/pkg-config:
#!/bin/bash
HOST_PKG_CFG=/usr/bin/pkg-config

if [ ! $SYSROOT ]; then
    echo "Please make sure you are in cross-compile environment!"
    exit 1
fi
$HOST_PKG_CFG --exists $*
if [ $? -ne 0 ]; then
    exit 1
fi
if $HOST_PKG_CFG $* | sed -e "s/-I/-I\/vita\/sysroot/g;\
s/-L/-L\/vita\/sysroot/g"
then
    exit 0
else
    exit 1
fi

并为pkg-config增加执行权限:
vita@baisheng:/vita/cross-tool/bin$ chmod a+x pkg-confi

下面是宿主系统自身的pkg-config获得的libmount库的--cflags和--libs:
vita@baisheng:~$ /usr/bin/pkg-config --cflags --libs mount
    -I/usr/include/libmount -I/usr/include/blkid
    -I/usr/include/uuid -lmount

下面是经过我们包装的pkg-config得的libmount库的--cflags和--libs:
vita@baisheng:~$ pkg-config --cflags --libs mount
    -I/vita/sysroot/usr/include/libmount
    -I/vita/sysroot/usr/include/blkid
    -I/vita/sysroot/usr/include/uuid -lmount 

显然,经过我们包装的pkg-config不再到宿主系统的文件系统下寻找依赖的库,而是到目标系统的根文件系统下去寻找依赖的共享库及头文件等。

点击复制链接 与好友分享!回本站首页
分享到: 更多
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:2.2.9 定义工具链相关的环境变量
下一篇:2.2.11 关于使用libtool链接库的讨论
相关文章
图文推荐
3.3.6 GNOME的软件管
3.3.5 GNOME的文件管
3.3.4 GNOME的窗口管
3.3.3 收藏夹和快捷
排行
热门
文章
下载
读书

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做最好的IT技术学习网站