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
使用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部分帮助信息如下:
黄色衬底的部分指定了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 环境变量
继续看帮助信息,部分内容如下:
黄色衬底的部分指定了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重新生成,因此之前的修改无效了)。
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目录中,否则会出错。