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。具体步骤如下:
- 移植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
- 编译安装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"