最近移植一些第三方开源库,移植中遇到一些问题,写出来和大家分享。解决困难的过程也是学习的过程。下面就是一份总结吧。
需要移植的库:
root@ubuntu:/work/SKIA/3rdparty# ls
3716C_libs freetype-2.3.4 libpng-1.2.16 libpng-1.2.44 README
curl-7.20.0 giflib-4.1.6 jpeg-8b libiconv-1.13.1 libpng-1.2.43 libxml2-2.6.30 zlib-1.2.3
其中curl库不需要移植。
在嵌入式开发中经常见到把交叉编译工具链安装到系统目录下:/usr/local/目录下,在这里提供一个参考方法:
文件 如:arm.env
root@ubuntu:/ubuntu/嵌入式Linux应用开发技术大全# cat arm.env
export PATH=/ubuntu/嵌入式Linux应用开发技术大全/tools/gcc-3.4.5-glibc-2.3.6/bin:$PATH
source arm.env 这样我们就可以把工具链放在任意位置了。
1.首先编译jpeg库,这个库没有费多大劲直接 ./configure
写了一个shell脚本:
- root@ubuntu:/work/SKIA/3rdparty/jpeg-8b# cat build3716C.sh -n
-
1 #!/bin/bash
-
2 #1. use auto-generated Makefile compile jpeg
-
3 echo -e "\nStart configure...\n"
-
4 sleep 2
-
5 ./configure -host=arm-hisiv200-linux --prefix=/work/SKIA/rootfs/usr/
-
6 #2. complile
-
7 echo -e "\nStart compiling...\n"
-
8 sleep 2
-
9 make
-
10 #3 make install
-
11 echo -e "\nStart install...\n"
-
12 sleep 2
-
13 make install
-
14 #4. copy relevant libs to specified directory.
-
15 echo -e "\nCopy libs...\n"
-
16 cp -d .libs/libjpeg.so* ../3716C_libs
-
17
到安装目录看一下:
- root@ubuntu:/work/SKIA/rootfs/usr/lib# ls
-
libjpeg.a libjpeg.la libjpeg.so libjpeg.so.8 libjpeg.so.8.0.2
-
root@ubuntu:/work/SKIA/rootfs/usr/lib# file libjpeg.so.8.0.2
-
libjpeg.so.8.0.2: ELF 32-bit LSB shared object, ARM, version 1 (SYSV), dynamically linked, not stripped
-
root@ubuntu:/work/SKIA/rootfs/usr/include# ls
-
jconfig.h jerror.h jmorecfg.h jpeglib.h
-
root@ubuntu:/work/SKIA/rootfs/usr/bin# ls
-
cjpeg djpeg jpegtran rdjpgcom wrjpgcom
-
root@ubuntu:/work/SKIA/rootfs/usr/share/man/man1# ls
-
cjpeg.1 djpeg.1 jpegtran.1 rdjpgcom.1 wrjpgcom.1
大概过程都是一样的,在gif库中有一个脚本autogen.sh
- root@ubuntu:/work/SKIA/3rdparty/giflib-4.1.6# cat autogen.sh -n
-
1 #!/bin/sh
-
2
-
3 # This script runs commands necessary to generate a Makefile for libgif.
-
4
-
5 echo "Warning: This script will run configure for you -- if you need to pass"
-
6 echo " arguments to configure, please give them as arguments to this script."
-
7
-
8 srcdir=`dirname $0`
-
9 test -z "$srcdir" && srcdir=.
-
10
-
11 THEDIR="`pwd`"
-
12 cd $srcdir
-
13
-
14 aclocal
-
15 autoheader
-
16 libtoolize --automake
-
17 automake --add-missing
-
18 autoconf
-
19 automake
-
20
-
21 cd $THEDIR
-
22
-
23 $srcdir/configure $*
-
24
-
25 exit 0
这是一个自动产生Makefile的脚本。生成Makefile后,可以使用上边的build.sh脚本来编译。前提是你安装好automake工具。在ubuntu上:apt-get install automake
z库还有一点不同,它的configure文件不是automak工具生成的,有自己的格式:
root@ubuntu:/work/SKIA/3rdparty/zlib-1.2.3# ./configure --help
usage:
configure [--shared] [--prefix=PREFIX] [--exec_prefix=EXPREFIX]
[--libdir=LIBDIR] [--includedir=INCLUDEDIR]
在写build.sh脚本的时候就按照这个格式写就可以了。
export CC=arm-hisiv200-linux-gcc
#1 ./configure
echo -e "\n Start configure...\n"
sleep 2
./configure --share --prefix=/work/SKIA/rootfs/usr/
最让人头疼的是png库,生成png文件后,由于png依赖z库,所以要指定libz 库和头文件的位置。
在build.sh中这样指定:
export CFLAGS=-I/work/SKIA/3rdparty/zlib-1.2.3
export LDFLAGS=-L/work/SKIA/3rdparty/zlib-1.2.3
然后make:
但是总是出现下面的错误:
- PNG12_0 '{global:' > libpng.vers.new
-
/bin/bash: PNG12_0:找不到命令
-
make[1]: *** [libpng.vers] 错误 127
-
make[1]:正在离开目录 `/work/SKIA/3rdparty/libpng-1.2.16'
-
make: *** [all] 错误 2
-
rm -f libpng.vers libpng.vers.new
-
PNG12_0 '{global:' > libpng.vers.new
-
/bin/bash: PNG12_0:找不到命令
-
make: *** [libpng.vers] 错误 127
将 Makefile中 有libpng.vers的全部注掉,呵呵这是google来,是老外出的主意。
阅读(3352) | 评论(0) | 转发(1) |