代码改变世界

GD库的交叉编译

2013-04-16 13:13  Yang小白  阅读(1259)  评论(0编辑  收藏  举报

开发平台:Fedora9

编译器:arm-linux-gcc-4.4.3

GD库是一个C语音库,可以通过过调用在C语言中创建图像绘图,也在PHP的动态网页、动态创建图像时用到GD库,但GD库的安装是一件“烦人”的事情,因为它依赖于其他库 libfreetype、libjpeg、libpng(先得安装libz库),所以在交叉编译安装GD库时,得按照顺序先交叉编译上面提到的库文件。

需要的源码包:freetype-2.4.4.tar.gz 

       jpegsrc.v7.tar.gz

       zlib-1.2.5.tar.gz

         libpng-1.2.44.tar.gz

       gd-2.0.35.tar.gz       版本不一定得全一样,接近即可,其中libjpeg比较特殊,v6以前的版本比较旧,配置比较麻烦,最好用v7以上的版本。

一般默认的安装目录

库文件:/usr/local/lib/

头文件:/usr/local/include/

1、libfreetype的交叉编译

 FreeType是一个用C语言实现的字体栅格化引擎制作的函数库。它可以用来将字符栅格化并映射成位图以及提供其他字体相关业务的支持。它支持各种字体格式,包括TrueType、Type 1以及OpenType等。

交叉编译freetype-2.4.4.tar.gz  :

# tar zvxf freetype-2.4.4.tar.gz  

# cd freetype-2.4.4

./configure CC=arm-linux-gcc  --host=arm-linux –prefix=$PWD/_install

# make && make install

2、libjpeg的交叉编译 :

 libjpeg 是一个完全用C语言编写的函数库,包含了被广泛使用的JPEG编解码以及其他功能的实现。

交叉编译 jpegsrc.v7.tar.gz

# tar zvxf jpegsrc.v7.tar.gz 

# cd jpeg-7/

#  ./configure CC=arm-linux-gcc  --host=arm-linux

# make && make install

3、libz的交叉编译 :

用来支持数据压缩或解压的函数库,最初为libpng函数库所写,后来普遍为许多程序所用。由Jean-loup Gailly与Mark Adler所开发。

交叉编译 zlib-1.2.5.tar.

# tar zvxf zlib-1.2.5.tar.gz

# cd zlib-1.2.5/  

# export CC=arm-linux-gnu-gcc   //它的configure不支持用CC变量来指定交叉工具链 

# ./configure --prefix=/usr/local  //最后生成的库、头文件和man文件都在指定目录下

# make && make install

 

4、libpng的交叉编译:

libpng(PNG库)是一种用于创建和修改PNG格式图形文件的工具。PNG格式可以在较小程度上替代GIF、TIFF格式,并且有很多改进和延伸。

 

交叉编译 libpng-1.2.44.tar.gz( 依赖zlib库)

# tar zvxf  libpng-1.2.44.tar.gz

# cd libpng-1.2.44

# ./configure CC=arm-linux-gcc  --host=arm-linux 

# make && make install

5、GD库的交叉编译 

 终于来到这一步了,如果有按照前面的顺序交叉编译安装,这一步make是不会有问题的。

# tar zvxf  gd-2.0.35.tar.gz

# cd gd-2.0.35

# ./configure CC=arm-linux-gcc  --host=arm-linux 

# make && make install

 

所有安装完毕,到目录/usr/local/lib/ 下查看产生的库文件

ls -al /usr/local/lib
总计 9144
drwxr-xr-x 8 root root 4096 04-16 02:01 .
drwxr-xr-x 12 root root 4096 2012-08-07 ..
drwxr-xr-x 2 root root 4096 04-15 19:58 bin
drwxr-xr-x 3 root root 4096 04-16 01:30 include
drwxr-xr-x 3 root root 4096 04-16 01:30 lib
-rw-r--r-- 1 root root 2822592 04-16 00:57 libfreetype.a
-rwxr-xr-x 1 root root 953 04-16 00:57 libfreetype.la
lrwxrwxrwx 1 root root 20 04-16 00:57 libfreetype.so -> libfreetype.so.6.6.2
lrwxrwxrwx 1 root root 20 04-16 00:57 libfreetype.so.6 -> libfreetype.so.6.6.2
-rwxr-xr-x 1 root root 1944311 04-16 00:57 libfreetype.so.6.6.2
-rw-r--r-- 1 root root 617800 04-16 02:01 libgd.a
-rwxr-xr-x 1 root root 878 04-16 02:01 libgd.la
lrwxrwxrwx 1 root root 14 04-16 02:01 libgd.so -> libgd.so.2.0.0
lrwxrwxrwx 1 root root 14 04-16 02:01 libgd.so.2 -> libgd.so.2.0.0
-rwxr-xr-x 1 root root 511163 04-16 02:01 libgd.so.2.0.0
-rw-r--r-- 1 root root 1381730 04-16 01:02 libjpeg.a
-rwxr-xr-x 1 root root 919 04-16 01:02 libjpeg.la
lrwxrwxrwx 1 root root 16 04-16 01:02 libjpeg.so -> libjpeg.so.7.0.0
lrwxrwxrwx 1 root root 16 04-16 01:02 libjpeg.so.7 -> libjpeg.so.7.0.0
-rwxr-xr-x 1 root root 881656 04-16 01:02 libjpeg.so.7.0.0
-rw-r--r-- 1 root root 298986 04-16 01:45 libpng12.a
lrwxrwxrwx 1 root root 13 04-16 01:45 libpng12.so -> libpng12.so.0
lrwxrwxrwx 1 root root 20 04-16 01:45 libpng12.so.0 -> libpng12.so.0.1.2.44
-rwxr-xr-x 1 root root 267438 04-16 01:45 libpng12.so.0.1.2.44
lrwxrwxrwx 1 root root 10 04-16 01:45 libpng.a -> libpng12.a
lrwxrwxrwx 1 root root 11 04-16 01:45 libpng.so -> libpng.so.3
lrwxrwxrwx 1 root root 18 04-16 01:45 libpng.so.3 -> libpng.so.3.1.2.44
-rwxr-xr-x 1 root root 267438 04-16 01:45 libpng.so.3.1.2.44
-rw-r--r-- 1 root root 106510 04-16 01:39 libz.a
lrwxrwxrwx 1 root root 13 04-16 01:39 libz.so -> libz.so.1.2.5
lrwxrwxrwx 1 root root 13 04-16 01:39 libz.so.1 -> libz.so.1.2.5
-rwxr-xr-x 1 root root 114047 04-16 01:39 libz.so.1.2.5
drwxr-xr-x 2 root root 4096 04-16 01:45 pkgconfig
drwxr-xr-x 4 root root 4096 04-16 01:30 share

# file /usr/local/lib/libgd.so.2.0.0

/usr/local/lib/libgd.so.2.0.0: ELF 32-bit LSB shared object, ARM, version 1 (SYSV), not stripped

可以看到已经交叉编译生成ARM平台的GD库文件。

# ls /usr/local/include/
entities.h gdcache.h gdfontmb.h gdfx.h jconfig.h jpeglib.h pngconf.h zlib.h
freetype2 gdfontg.h gdfonts.h gd.h jerror.h libpng png.h
ft2build.h gdfontl.h gdfontt.h gd_io.h jmorecfg.h libpng12 zconf.h

gd.h头文件生成在/usr/local/include/

现在测试一下GD库:

zx.c//////

# cat zx.c


#include <stdio.h>
#include <gd.h>

int main(void)
{

gdImagePtr im;
FILE *ground_fp;
char *ground_file;
int red,black;
ground_file="test.png";

ground_fp = fopen(ground_file,"w+");

im=gdImageCreate(50,100);   //生成一张图片


black=gdImageColorAllocate(im,0,0,0);
red=gdImageColorAllocate(im,255,192,192);
gdImageLine(im,10,20,45,85,red); //画线
gdImageLine(im,0,20,45,85,red);

gdImagePng(im,ground_fp);
gdImageDestroy(im);
fclose(ground_fp);
}

在交叉编译这个c测试程序时,还需得指明gd.h头文件路径,还有需要前面几个库文件的路径,才能顺利编译成功,没办法GD库就是这般矜持Oz

[root@foobo gdtest]# arm-linux-gcc zx.c -I /usr/local/include -L /usr/local/lib -lgd -lfreetype -ljpeg -lpng -lz -o zx2
[root@foobo gdtest]# ls
zx zx1 zx2 zx.c

NFS到开发板测试成功(在开发板运行程序时,必须把前面生成的动态库或者静态库先移到板上)

[root@foobo share]# ls
abc.html buttons hello led leds.html wodegeshengli.mp3 zx2
biyesheji driver_mini2440_adc kuwenjiangARM9 leds.cgi test.png ws031202 

已经生成图片 test.png 

 

 

 

如果在编译时不加入库文件编译,它就会报错:

[root@foobo gdtest]# arm-linux-gcc zx.c -I /usr/local/include -o zx3

/tmp/ccUULvRn.o: In function `main':
zx.c:(.text+0x38): undefined reference to `gdImageCreate'
zx.c:(.text+0x54): undefined reference to `gdImageColorAllocate'
zx.c:(.text+0x70): undefined reference to `gdImageColorAllocate'
zx.c:(.text+0x9c): undefined reference to `gdImageLine'
zx.c:(.text+0xc0): undefined reference to `gdImageLine'
zx.c:(.text+0xcc): undefined reference to `gdImagePng'
zx.c:(.text+0xd4): undefined reference to `gdImageDestroy'
collect2: ld returned 1 exit status 

就是缺失库文件

如果只加入libgd 其他库不加入 还是会报错

[root@foobo gdtest]#arm-linux-gcc zx.c -I /usr/local/include -L /usr/local/lib -lgd -o zx3

/opt/FriendlyARM/toolschain/4.4.3/lib/gcc/arm-none-linux-gnueabi/4.4.3/http://www.cnblogs.com/http://www.cnblogs.com/arm-none-linux-gnueabi/bin/ld: warning: libjpeg.so.7, needed by /usr/local/lib/libgd.so, not found (try using -rpath or -rpath-link)
/opt/FriendlyARM/toolschain/4.4.3/lib/gcc/arm-none-linux-gnueabi/4.4.3/http://www.cnblogs.com/http://www.cnblogs.com/arm-none-linux-gnueabi/bin/ld: warning: libfreetype.so.6, needed by /usr/local/lib/libgd.so, not found (try using -rpath or -rpath-link)
/opt/FriendlyARM/toolschain/4.4.3/lib/gcc/arm-none-linux-gnueabi/4.4.3/http://www.cnblogs.com/http://www.cnblogs.com/arm-none-linux-gnueabi/bin/ld: warning: libz.so.1, needed by /usr/local/lib/libgd.so, not found (try using -rpath or -rpath-link)

所以还是老老实实按照报错的提示把上面库全加,嫌麻烦就写个makefile文件。

 

 

在这之前在交叉编译测试文件时可能还会遇到一个错误就是:可能你前面其他库有些库文件在交叉编译中没配置,按照80386的平台编译生产库文件,加入时会报这样

的错误:(ld: skipping incompatible 链接库文件时 跳过 矛盾)

例如

/usr/bin/ld: skipping incompatible /usr/lib/http://www.cnblogs.com/libz.so when searching for -lz 

 

#file /lib/libz.so.1.2.3

/lib/libz.so.1.2.3: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), stripped

表明该文件是32位文件,但基于Intel,固与arm-linux-gcc不兼容。

所以一定得保证前面编译的其他库也是交叉编译出来的。