Chinaunix首页 | 论坛 | 博客
  • 博客访问: 138064
  • 博文数量: 30
  • 博客积分: 887
  • 博客等级: 准尉
  • 技术积分: 342
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-03 19:11
文章分类

全部博文(30)

文章存档

2012年(19)

2011年(1)

2010年(6)

2009年(4)

我的朋友

分类: 嵌入式

2012-02-21 16:15:24

转载于 http://hi.baidu.com/firefly007/blog/item/c57bf65719eb48d5b645ae36.html

这哥们的流程蛮好,我只是截取了一种方法,并且在配置的时候加上了 --host=arm-linux 


1、解压源代码包
# cd tarball
# for f in $(ls *.tar.gz); do tar -zxvf $f –C ../src-arm; done
或者:
# cd tarball
# tar -zxvf zlib-1.2.3.tar.gz -C ../src-arm
# tar -zxvf libid3tag-0.15.1b.tar.gz -C ../src-arm
# tar -zxvf libmad-0.15.1b.tar.gz -C ../src-arm
# tar -zxvf madplay-0.15.2b.tar.gz -C ../src-arm

2、编译madplay及其所依赖的库文件

(1)设定编译器环境变量
# export CC=arm-linux-gcc

(2)编译zlib,因为libid3tag依赖于这个库文件
# cd ../src-arm/zlib-1.2.3
# ./configure --prefix=/opt/madplay/target-arm
# make
# make install
或者:
打开/opt/madplay/src-arm/zlib-1.2.3
目录下的Makefile文件,按以下内容修改并保存:
CC=arm-linux-gcc
AR=arm-linux-ar rcs
RANLIB=arm-linux-ranlib
prefix=/opt/madplay/target-arm

然后make,make install,编译好之后就可以在上面prefix指定目录下的lib目录下找到libz.a这个库。

(3)编译libid3tag
# cd ../libid3tag-0.15.1b
# ./configure --host=arm-linux --prefix=/opt/madplay/target-arm --disable-debugging --disable-shared --enable-static CPPFLAGS=-I/opt/madplay/target-arm/include LDFLAGS=-L/opt/madplay/target-arm/lib 
 --host=arm-linux 
# make
# make install

(4)编译libmad
# cd ../libmad-0.15.1b
# ./configure --host=arm-linux --prefix=/opt/madplay/target-arm --disable-debugging --disable-shared --enable-static CPPFLAGS=-I/opt/madplay/target-arm/include LDFLAGS=-L/opt/madplay/target-arm/lib 
 --host=arm-linux 
# make
# make install

(5)编译madplay
# cd ../madplay-0.15.2b
# ./configure --host=arm-linux --prefix=/opt/madplay/target-arm --disable-debugging --disable-shared --enable-static CPPFLAGS=-I/opt/madplay/target-arm/include LDFLAGS=-L/opt/madplay/target-arm/lib --host=arm-linux
# make
# make install

但是,这样得到的是动态链接。如果在madplay-0.15.2b目录中执行arm-inux-gcc命令,并且在最后加上-static,运行以后就可以得到静态链接的程序,如(6)所示。

(6)静态链接
arm-linux-gcc -Wall -O2 -fomit-frame-pointer -o madplay-s madplay.o getopt.o getopt1.o version.o resample.o filter.o tag.o crc.o rgain.o player.o audio.o audio_aiff.o audio_cdda.o audio_hex.o audio_null.o audio_raw.o audio_snd.o audio_wave.o audio_oss.o -L/opt/madplay/target-arm/lib /opt/madplay/target-arm/lib/libmad.a /opt/madplay/target-arm/lib/libid3tag.a -lz -lm -static

执行完毕后,动态链接可执行文件将被安装在我们指定的目录中:/opt/madplay/target-arm
静态链接可执行文件将被安装在我们当前的目录中:/opt/madplay/src-arm/madplay-0.15.2b
# ls /opt/madplay/target-arm/bin
abxtest madplay
其中abxtest是附加生成的测试程序,不必理会。

使用file命令检查一下:
# file /opt/madplay/target-arm/bin/madplay
madplay: ELF 32-bit LSB executable, ARM, version 1, for GNU/Linux 2.4.3, dynamically linked (uses shared libs), not stripped

# file /opt/madplay/src-arm/madplay-0.15.2b
madplay: ELF 32-bit LSB executable, ARM, version 1, for GNU/Linux 2.4.3, statically linked, not stripped
上面显示了我们编译得到的两个链接可执行程序:动态链接和静态链接。

# arm-linux-readelf -d /opt/madplay/target-arm/bin/madplay
最上面显示了动态链接编译所需的动态库:libm.so.6和libc.so.6。

静态链接文件大小为922.2KB(944377字节),动态链接文件大小仅仅为285.8KB(292690字节),但是运行时需要某些动态库。

3、下载madplay到开发板运行测试
为了区别于板子中已经存在的madplay,我们把新做的改名为mymadplay,把它以及依赖库通过FTP或者NFS方式下载到开发板,并作如下放置:
执行文件mymadplay放在/usr/bin/目录,库文件:libm.so.6和libc.so.6放在/usr/lib目录,当然如果是静态链接的可执行程序就不用拷贝库文件了。
拷贝一首mp3文件到开发板上,然后执行mymadplay进行测试。

4、构建并修正ARM版本的编译脚本build-arm.sh
既然我们已经构建了一个简单易用的编译脚本,现在就可以通过对它稍作修改来进行交叉编译了,这就是通常所说的移植。简单的移植只要重新指定一下编译器就可以了,可以通过修改环境变量来实现。很多的移植所要修改的环境变量是:
CC:编译器,系统默认为gcc
AR:库工具,用以创建和修改库,系统默认ar
LD:链接器,系统默认为LD
RANLIB:随机库创建器,系统默认为ranlib
AS:汇编器,系统默认为as
NM:库查看工具,系统默认为nm

还有一些不常用的其他环境变量,在此就不一一列举了。

需要注意的是,并不是每个移植都需要做全面的环境变量修改,有些是不需要改的,这要根据实际情况,也就是系统提示信息来调整。
除了要修改编译器环境变量,一般还需要在配置中加入标平台指定标识,在此为"arm-linux"


阅读(1864) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~