交叉编译库依赖问题的解决方法

来源:互联网 发布:php自定义config 编辑:程序博客网 时间:2024/05/17 03:58

http://jianbo.de/b/archives/503

在交叉编译移植程序的时候,我们常常会遇到这样的情况:要编译的程序依赖于某个动态/静态链接库。而这个库也需要我们编译移植。在编译没有别的依赖的链接库的时候很简单,设置好交叉工具链、目标架构就可以了。而在编译有依赖需求的程序的时候,我们常常遇到找不到头文件、找不到库文件的问题。很是烦人。
要解决这个问题,其实还是很容易的。只需要先编译安装好运行库,然后在编译有依赖需求的程序的时候,在编译参数里把目标板上的库路径、头文件路径分别通过-L、-I选项添加到工具链中即可。这样一来既不会影响目标板、编译宿主系统的正常运行,也不用每次手动把文件复制到工具链中造成污染(而且升级的时候也分不出来)。
用代码来说话:

export CFLAGS="-L/path/to/target/libs -I/path/to/target/headers"./configure [some options]make && make install

举例来说,假设我的目标系统是mini2440开发板(CPU是基于armv4t内核的S3C2440),工具链是CodeSourcery提供的GNU ARM/LINUX工具链。目标板的根文件系统位于/mini2440/root,要编译的程序是lighttpd,依赖于pcre。具体步骤如下:

  1. 移植pcre
    cd /tmp# 新建pcre、pcre-install目录,分别用于编译和安装pcremkdir pcre{,-install}# 下载解压wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.00.tar.bz2tar xvf pcre-8.00.tar.bz2 -C ./pcrecd pcre/# 配置(启用unicode支持、设置host运行时系统为arm-none-linux-gnueabi,使configure猜出交叉编译工具链前缀)./configure --host=arm-none-linux-gnueabi --prefix=/ --enable-utf8 --enable-unicode-properties# 编译安装到临时目录/tmp/pcre-install# 由于是用于嵌入式,所以像文档这类东西就不要了。我们之需要将动态链接库和头文件留下make && make DESTDIR=/tmp/pcre-install installcp -rv ../pcre-install/lib/pcre.so* /mini2440/root/libcp -rv ../pcre-install/include/pcre.so* /mini2440/root/include
  2. 编译安装lighttpd
    cd /tmp# 新建lighttpd、lighttpd-install目录,分别用于编译和安装mkdir lighttpd{,-install}# 下载解压wget http://download.lighttpd.net/lighttpd/releases-1.4.x/lighttpd-1.4.25.tar.bz2tar xvf lighttpd-1.4.25.tar.bz2 -C ./lighttpdcd lighttpd/# 配置(启用unicode支持、设置host运行时系统为arm-none-linux-gnueabi,使configure猜出交叉编译工具链前缀)CFLAGS="-march=armv4t -I/mini2440/root/include -L/mini2440/root/lib"            ./configure --prefix=/ --host=arm-none-linux-gnueabi            --disable-FEATURE --disable-ipv6 --disable-lfs            --without-zlib --without-bzip2# 编译安装到临时目录/tmp/pcre-install# 由于是用于嵌入式,所以像文档这类东西就不要了。我们之需要将动态链接库和可执行文件留下make && make DESTDIR=/tmp/lighttpd-install installcp -rv ../lighttpd-install/lib/* /mini2440/root/libcp -rv ../lighttpd-install/sbin/* /mini2440/root/sbin

    这样就可以了

看上面的例子,最关键的地方,就是配置lighttpd的时候,在配置项目前的CFLAGS变量的设置。其实我们完全可以把他单独设置成环境变量,这样就不用每次编译东西都需要输入了。

export CFLAGS="-march=armv4t -I/mini2440/root/include -L/mini2440/root/lib"

原创粉丝点击