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

前端之家收集整理的这篇文章主要介绍了交叉编译库依赖问题的解决方法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

./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"

猜你在找的设计模式相关文章