交叉编译libgd

1、环境说明

1.1 计算机

    acer4739Z+win7+WMware+ubuntu14.04

1.2交叉编译工具链

    名称前缀:arm-arago-linux-gnueabi

    所在目录::~/arago-2011.09/armv5te/bin、~/arago-2011.09/armv5te/lib

1.3 开发板

    omapl138+linux

2、libgd源码

    下载libgd-2.1.0.tar.bz2,然后在~目录中将其解压,解压出来的目录为libgd-2.1.0。

3、配置

3.1 安装目录

    在~目录中创建一个omapl138_rootfs,用于安装编译好的libgd。

3.2 配置脚本

    进入libgd-2.1.0目录

ubuntu $ cd libgd-2.1.0

    为了方便配置,自己编写一个shell脚本如下:

#!/bin/bash
PREFIX=/home/liyihai/omapl138_rootfs
HOST=arm-arago-linux-gnueabi
./configure --prefix=$PREFIX --host=$HOST

    将上述脚本内容保存为configure.sh,并使用以下命令使其具有可执行权限:

ubuntu $ chmod +x configure.sh
    执行configure.sh脚本进行配置:

ubuntu $ ./configure.sh
   结果如下:

** Configuration summary for libgd 2.1.0:

   Support for Zlib:                 no
   Support for PNG library:          yes
   Support for JPEG library:         no
   Support for VPX library:          yes
   Support for TIFF library:         yes
   Support for Freetype 2.x library: yes
   Support for Fontconfig library:   yes
   Support for Xpm library:          yes
   Support for pthreads:             no

4、头文件路径

    使用make命令,就可以进行编译:

ubuntu $ make
    关键是在编译的过程中,会出现各种问题需要解决。下面就重点描述解决问题的过程。  

4.1 gdft.c:1338:35: fatal error: fontconfig/fontconfig.h: No such file or directory

    使用find命令查找fontconfig.h,发现ubuntu中存在/usr/local/include/fontconfig/fontconfig.h,只是交叉编译工具链并没自动到/usr/local/include这个目录来寻找所需要的头文件而已。既然这样,就要自己头文件目录了。有3种方法可以达到这个目录。

4.1.1 configure参数

    在3.2的confiure.sh脚本中,调用了另外一个配置脚本configure,只是指定了--prefix和--host这两个参数。这里试图通过添加一个参数,使编译器能找到/usr/local/include下的头文件。执行以下命令查看帮助:

$ ./configure --help
    部分帮助信息如下:

交叉编译libgd_第1张图片

    黄色衬底的部分指定了C header files的目录。于是在configure的参数中添加--includedir=/usr/local/include,如下

./configure --prefix=$PREFIX --host=$HOST --includedir=/usr/local/include
    重新配置,然后再次使用make命令编译。结果问题依旧!

    再仔细看上图可发现红色圈着的部分说明了--includedir是libdg的安装路径,而不是编译过程中编译器寻找头文件的路径!赶紧将上面的--includedir参数删除,免得误将交叉编译的结果安装到ubuntu的默认头文件路径中了。

    再看help信息,发现部分内容如下:


    --x-includes不是代表外部头文件?试一下就知道。在是在configure的参数中添加--x-includes=/usr/local/include,如下:

./configure --prefix=$PREFIX --host=$HOST --x-includes=/usr/local/include
   重新执行configure.sh进行配置,然后再make。结果发现 问题依旧

   再看帮助信息,已经找不到其它和include有关的参数了。到此为止,试图通过添加configure的参数来指定头文件路径的目的已经彻底失败,只能使用其它方法了。

4.1.2 环境变量

    继续看帮助信息,部分内容如下:

交叉编译libgd_第2张图片

    黄色衬底的部分指定了C compiler flags,因此在3.2的配置脚本configure.sh中添加CFLAGS(注意:添加在./configure的前面)

#!/bin/bash
PREFIX=/home/liyihai/omapl138_rootfs
HOST=arm-arago-linux-gnueabi
CFLAGS=-I/usr/local/include
./configure --prefix=$PREFIX --host=$HOST

    再执行configure.sh配置脚本对libgd重新配置,然后再次使用make命令进行编译。结果问题依然

    查看libgd-2.1.0/src目录下的Makefile,发现CFLAGS变量中根本就没有-I/usr/local/include,如下图:


    在CFLAGS的前面添加export,如下:

#!/bin/bash
PREFIX=/home/liyihai/omapl138_rootfs
HOST=arm-arago-linux-gnueabi
export CFLAGS=-I/usr/local/include
./configure --prefix=$PREFIX --host=$HOST

    再执行configure.sh配置脚本对libgd重新配置,然后再次使用make命令进行编译。结果问题解决

    这时,在进入libgd-2.1.0/src目录中,打开Makefile找到CFLAGS的行,其内容如下:


    可见,已经有了-I/usr/local/include。这说明在configure.sh中设置的CFLAGS要添加export才生效。

4.2 gdxpm.c:29:21: fatal error: X11/xpm.h: No such file or directory

4.2.1 修改CFLAGS环境变量

   使用find命令查找发现ubuntu中是存在/usr/include/X11/xpm.h,因此有了4.1的经验,希望在CFLAGS中添加/usr/include,如下:

#!/bin/bash
PREFIX=/home/liyihai/omapl138_rootfs
HOST=arm-arago-linux-gnueabi
export CFLAGS='-I/usr/local/include -I/usr/include'
./configure --prefix=$PREFIX --host=$HOST

    重新执行configure.sh,然后make,结果如下:


    事情总是没那么顺利,由上图红色圈5可知,出错了。

    由红色圈1和红色圈2可见,它们是一样的;另外由红色圈3和红色圈4可见,/usr/include和、/usr/local/include都已经在编译器的头文件目录中。

     由于4.1节已经知道将/usr/local/include包含在环境变量CFLAGS中是没有问题的,现在之所以出错,那就是/usr/include的问题了。将/usr/include从环境变量CFLAGS删除,就没有上图红色圈5的错误。

    现在只能使用下面的方法来解决这个问题了。

4.2.2 修改Makefile

    进入libgd-2.1.0/src目录,打开Makefile,修改CFLAGS的值,如下:


    没错,就是直接在Makefile中修改CFLAGS的值,而不是通过设置环境变量CFLAGS来影响Makefile中的CFLAGS的值!

    由上图可见,在Makefile中修改CFLAGS的值时,就算添加/usr/include也不会出现4.2.1的错误,而且解决了4.2的错误。

    原因分析:设置CFLAGS环境变量时,影响的不仅是Makefile中的CFLAGS变量,而且还会影响到别的地方(具体位置不详),从而导致了错误。而直接修改Makefile中的CFLAGS时,其有效域仅是本Makefile文件,不会对其它地方造成影响。

    到此为止,所有的头文件路径文件已经解决。

4.3 关于解决头文件找不到的其他方法

4.3.1 直接复制

    可以直接将/usr/include、/usr/loccal/include下的头文件复制到libgd-2.1.0/src中,不用进行任何参数或者环境变量的设置。

4.3.2 修改CCPFLAGS

    在libgd-2.1.0/src中的Makefile中,不仅有CFLAGS变量,还有一个CPPFLAGS变量,如下图:


    可以为CPPFLAGS添加-I/usr/include -I/usr/local/include,同样可以解决问题。

5、依赖库

    在解决头文件路径之后,就是库的路径了。libgd所依赖的库如下红色圈的部分。

    

    在omapl138_rootfs中创建一个lib目录

ubuntu $ cd omapl138_rootfs
ubuntu $ mkdir lib
    然后将上述库复制到其中omapl138_rootfs/lib中(这些库从omapl138开发板上复制到ubuntu中,如果开发板上也没有,那就就要自己先编译好这些库)。然后指定库的路径。

5.1 添加配置参数

    在configure的帮助信息中,部分内容如下:


    由上图可见,可以通过参数添加zlib、png、freetye...的库路径。关于这点,在docs/README.TXT中有说明。然而,一共要写8个参数,未免过于麻烦,还是使用5.2的方法比较简单。

5.2 环境变量CFLAGS

    根据帮助信息的提示,同样可以通过修改环境变量(LDFLAGS)的方式来修改链接库的位置:

#!/bin/bash
PREFIX=/home/liyihai/omapl138_rootfs
HOST=arm-arago-linux-gnueabi
export CFLAGS=-I/usr/local/include
export LDFLAGS=-L$PREFIX/lib
./configure --prefix=$PREFIX --host=$HOST
    执行configure.sh,然后根据4.2.2方法,修改libgd-2.1.0/src/Makefile的CFLAGS的值,其实包含-I/usr/nclude(重新配置后,Makefile重新生成,因此之前的修改无效了)。
6、 库的依赖

    libgd依赖于第5章所说的库,但是那些库同时又依赖于别的库!因此,还需要将所依赖的库都找出来,从开发板中复制到ubuntu的~/omapl138_rootfs/lib中。关于查询一个库对其它库的依赖,可以参考《动态链接库那些事》。

    其实,对于所依赖的库,编译过程中会提示:


    由上图可以见libpng12.so依赖于libz.so.1。因此需要从开发板中将libz.so.1复制到ubuntu的~/omapl138_rootfs/lib中,如果它是个软链接文件,还需要将其所链接的文件复制过去。

    是不是将所依赖的库ibz.so.1复制到libpng12.so同一个目录下就可以了呢?答案是否定了。因为,这个时候编译器还是找不到libz.so.1!

    那么要怎么做才行呢?根据上图中下位置那个红色圈的提示,需要使用-rpath或者-rapth-link来指定依赖库的路径。关于-rpath和-rpath-link的区别,详见《-L、-rpath和-rpath-link的区别》,由于是交叉编译,这里使用-rpath-link。

6.1 修改环境变量LDFLAGS

    将5.2小节中的配置文件中的LDFLAGS修改为

export LDFLAGS='-L$PREFIX/lib -Wl,-rpath-link $PREFIX/lib'
    然后重新执行configure.sh进行配置。

6.2 修改Makefile

    使用6.1的方法,还需要重新配置,其实挺麻烦的。牛人就喜欢直接修改Makefile。打开src/Makefile,找到LDFLAGS,将添加以下内容:

-Wl,-rpath-link /home/liyihai/omapl138_rootfs/lib
    添加完后,结果如下图:

    到此为止,库的路径就添加完毕了。

6.3 例外情况

    ld-linux.so.3及其所软链接的库、libc.so.6及其所软链接的库,不能直接放在omapl138_rootfs/lib中,要放在交叉编译工具链的lib目录中,否则会出错。

你可能感兴趣的:(交叉编译libgd)