Madplay移植到mini2440全过程详解php
madplay交叉编译html
交叉编译器:arm-linux-gcc 3.4.1
PC环境:RedHat-6linux
注意:最好在root权限下执行如下移植,不然在make install时可能权限不够。工具
1、移植madplay前的准备测试
madplay的移植须要如下的几个包:libid3tag-0.15.1b.tar.gz、libmad-0.15.1b.tar.gz、madplay-0.15.2b.tar.gz、zlib-1.2.3.tar.gz。其中前面的三个包能够在http://sourceforge.net/project/showfiles.php?group_id=12349中下载,后一个包能够在http://www.gzip.org/zlib/zlib-1.2.3.tar.gz中找到。ui
注意:通常移植嵌入式应用软件的步骤是先在PC上配置编译该软件并运行,以了解一下该软件的用途和使用方法等,如今就让咱们先在PC上开始吧。spa
2、创建工做目录,拷贝源代码包.net
在/opt/madplay目录下创建madplay目录,并以此为工做目录,并在该目录中创建如下子目录,以存放不一样的文件:
# cd /opt
# mkdir madplay
# cd madplay
# mkdir tarball src-x86 src-arm target-x86 target-armdebug
目录说明:
tarball目录用来存放全部的源代码包
src-x86目录用来存放X86版本的全部源代码文件
src-arm目录用来存放ARM版本的全部源代码文件
target-x86目录是X86版本的安装目录
target-arm目录是ARM版本的安装目录
接下来把从网上下载到的源代码包放入tarball目录。unix
3、PC-Linux(PC版本)
一、解压源代码包
# cd tarball
# for f in $(ls *.tar.gz); do tar -zxvf $f –C ../src-86; done
或者:
# cd tarball
# tar -zxvf zlib-1.2.3.tar.gz -C ../src-86
# tar -zxvf libid3tag-0.15.1b.tar.gz -C ../src-86
# tar -zxvf libmad-0.15.1b.tar.gz -C ../src-86
# tar -zxvf madplay-0.15.2b.tar.gz -C ../src-86
二、编译madplay及其所依赖的库文件
(1)编译zlib,由于libid3tag依赖于这个库文件
# cd ../src-x86/zlib-1.2.3
# ./configure --prefix=/opt/madplay/target-x86
# make
# make install
编译好以后就能够在上面prefix指定目录下的lib目录下找到libz.a这个库。
(2)编译libid3tag
# cd ../libid3tag-0.15.1b
# ./configure --prefix=/opt/madplay/target-x86 --disable-debugging --disable-shared --enable-static CPPFLAGS=-I/opt/madplay/target-x86/include LDFLAGS=-L/opt/madplay/target-x86/lib
# make
# make install
其中,--disable-shared --enable-static是指定为静态编译,不过这样并不可以进行静态编译。至于为何,有待于继续研究。
(3)编译libmad
# cd ../libmad-0.15.1b
# ./configure --prefix=/opt/madplay/target-x86 --disable-debugging --disable-shared --enable-static CPPFLAGS=-I/opt/madplay/target-x86/include LDFLAGS=-L/opt/madplay/target-x86/lib
注意:若是此时make,make install就会报错,说是"-fforce-mem"参数不能识别。不知道是什么缘由,而后就在网上查了一通,好像说是我机器环境的gcc版本(个人是gcc 4.3.2)太高致使的,因此不能识别其中的"-fforce-mem"参数选项,真是搞不懂,版本高还识别不了。。。
因而乎就打开当前目录下的Makefile文件,去掉里面出现的"-fforce-mem",而后再make,make install就OK了。
(4)编译madplay
# cd ../madplay-0.15.2b
# ./configure --prefix=/opt/madplay/target-x86 --disable-debugging --disable-shared --enable-static CPPFLAGS=-I/opt/madplay/target-x86/include LDFLAGS=-L/opt/madplay/target-x86/lib
# make
# make install
可是,这样获得的是动态连接。若是在madplay-0.15.2b目录中执行gcc命令,而且在最后加上-static,运行之后就能够获得静态连接的程序,如(5)所示。
(5)静态连接
# gcc -Wall -O2 -fomit-frame-pointer -o madplay 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-x86/lib /opt/madplay/target-x86/lib/libmad.a /opt/madplay/target-x86/lib/libid3tag.a -lz -lm -static
执行完毕后,动态连接执行文件将被安装在咱们指定的目录中:/opt/madplay/target-x86
静态连接执行文件将被安装在咱们当前的目录中:/opt/madplay/src-x86/madplay-0.15.2b
# ls /opt/madplay/target-x86/bin
abxtest madplay
其中abxtest是附加生成的测试程序,没必要理会。
使用file命令检查一下:
# file /opt/madplay/target-x86/bin/madplay
madplay: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.8, dynamically linked (uses shared libs), not stripped
# file /opt/madplay/src-x86/madplay-0.15.2b
madplay: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.8, statically linked, not stripped
上面的信息显示了咱们编译获得的两个连接执行程序:动态连接和静态连接。
# arm-linux-readelf -d /opt/madplay/target-x86/bin/madplay
输出一大堆信息,最上面显示了动态连接编译所需的动态库:libm.so.6和libc.so.6。
静态连接文件大小为862.8KB(883531字节),动态连接文件大小仅仅为279.5KB(286206字节),可是运行时须要某些动态库。
三、测试PC-Linux版本的madplay
拷贝一首mp3文件到madplay所在的目录,执行:
# ./madplay test.mp3
若是你的声卡已经正确安装,就能够听到mp3 的声音了。
四、构建Shell编译脚本build-x86.sh
经过以上步骤,咱们看到配置和编译不只有必定的顺序,还须要注意一些安装细节,虽然此次编译经过了,但难免之后会忘记这个过程,特别是当程序更加复杂的时候,所以咱们要养成好习惯,把整个过程构建为一个脚本,之后只要执行这个脚本就能够完成全部步骤了,以下所示是PC-Linux版本的madplay构建脚本,该脚本位于madplay工做目录的根目录下。
build-x86.sh
|
4、ARM-Linux(ARM版本)
一、解压源代码包
# 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
二、编译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
# 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
# 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
# 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字节),可是运行时须要某些动态库。
三、下载madplay到开发板运行测试
为了区别于板子中已经存在的madplay,咱们把新作的更名为mymadplay,把它以及依赖库经过FTP或者NFS方式下载到开发板,并做以下放置:
执行文件mymadplay放在/usr/bin/目录,库文件:libm.so.6和libc.so.6放在/usr/lib目录,固然若是是静态连接的可执行程序就不用拷贝库文件了。
拷贝一首mp3文件到开发板上,而后执行mymadplay进行测试。
四、构建并修正ARM版本的编译脚本build-arm.sh
既然咱们已经构建了一个简单易用的编译脚本,如今就能够经过对它稍做修改来进行交叉编译了,这就是一般所说的移植。简单的移植只要从新指定一下编译器就能够了,能够经过修改环境变量来实现。不少的移植所要修改的环境变量是:
CC:编译器,系统默认为gcc
AR:库工具,用以建立和修改库,系统默认ar
LD:连接器,系统默认为LD
RANLIB:随机库建立器,系统默认为ranlib
AS:汇编器,系统默认为as
NM:库查看工具,系统默认为nm
还有一些不经常使用的其余环境变量,在此就不一一列举了。
须要注意的是,并非每一个移植都须要作全面的环境变量修改,有些是不须要改的,这要根据实际状况,也就是系统提示信息来调整。
除了要修改编译器环境变量,通常还须要在配置中加入目标平台指定标识,在此为"arm-linux",修改后的脚本以下:
build-arm.sh
|
PS:
在PC机和开发板上执行madplay程序的过程信息:
#madplay XXX.mp3
MPEG Audio Decoder 0.15.2 (beta) - Copyright (C) 2000-2004 Robert Leslie et al.
Title: XXXXXX
Artist: XXXXXX
Year: XXXXXX
Genre: XXXXXX
出现这些信息就成功了,音质还真不错,再加个图形界面和按键,就能作个MP3了!
Madplay还有一些参数:好比-r循环播放,还能够进行格式转换:
madplay 111.mp3 –o 222.wav。
功能很强大。
我用QT和madplay作了一个MP3播放器。稍后放出源代码。
转载:http://blog.chinaunix.net/uid-20539088-id-115750.html