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

./configure --build=mipsel-linux --host=mipsel-linux
--target=mipsel-linux' will build native mipsel-linux binutils on
mipsel-linux.


具体解释一下,build就是你正在使用的机器,host就是你编译好的程序可以运行的平台,target就是你编译的程序可以处理的平台.这个build和host比较好理解,但是target就不好办了,到底什么意思呢?一般来说,我们平时所说的交差编译用不到他target的,比如./configure --build=i386-linux,--host=arm-linux就可以了,在386的平台上编译可以运行在arm板的程序.但是,一般我们都是编译程序,而不是编译工具,如果我们编译工具,比如gcc,这个target就有用了.如果我们需要在一个我们的机器上为arm开发板编译一个可以处理mips程序的gcc,那么target就是mips了.不知道我的解释是否正确,如果大家看到了这篇帖子,觉得不对,批评指正. 




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目录,分别用于编译和安装pcre
    mkdir pcre{,-install}
    # 下载解压
    wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.00.tar.bz2
    tar xvf pcre-8.00.tar.bz2 -C ./pcre
    cd 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 install
    cp -rv ../pcre-install/lib/pcre.so* /mini2440/root/lib
    cp -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.bz2
    tar xvf lighttpd-1.4.25.tar.bz2 -C ./lighttpd
    cd 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 install
    cp -rv ../lighttpd-install/lib/* /mini2440/root/lib
    cp -rv ../lighttpd-install/sbin/* /mini2440/root/sbin
    

    这样就可以了

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

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

你可能感兴趣的:(交叉编译库依赖问题的解决方法)