Madplay移植到mini2440全过程具体解释
Posted xfgnongmin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Madplay移植到mini2440全过程具体解释相关的知识,希望对你有一定的参考价值。
madplay交叉编译
交叉编译器:arm-linux-gcc 3.4.1
PC环境:Ubuntu 8.10
注意:最好在root权限下运行下面移植。否则在make install时可能权限不够。
一、移植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中找到。
注意:一般移植嵌入式应用软件的步骤是先在PC上配置编译该软件并运行,以了解一下该软件的用途和用法等。如今就让我们先在PC上開始吧。
二、建立工作文件夹。拷贝源码包
在/opt/madplay文件夹下建立madplay文件夹,并以此为工作文件夹,并在该文件夹中建立下面子文件夹,以存放不同的文件:
# cd /opt
# mkdir madplay
# cd madplay
# mkdir tarball src-x86 src-arm target-x86 target-arm
文件夹说明:
tarball文件夹用来存放全部的源码包
src-x86文件夹用来存放X86版本号的全部源码文件
src-arm文件夹用来存放ARM版本号的全部源码文件
target-x86文件夹是X86版本号的安装文件夹
target-arm文件夹是ARM版本号的安装文件夹
接下来把从网上下载到的源码包放入tarball文件夹。
三、PC-Linux(PC版本号)
1、解压源码包
# 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
2、编译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字节)。可是运行时须要某些动态库。
3、測试PC-Linux版本号的madplay
拷贝一首mp3文件到madplay所在的文件夹。运行:
# ./madplay test.mp3
假设你的声卡已经正确安装,就能够听到mp3 的声音了。
4、构建Shell编译脚本build-x86.sh
通过以上步骤,我们看到配置和编译不仅有一定的顺序,还须要注意一些安装细节,尽管这次编译通过了。但不免以后会忘记这个过程,特别是当程序更加复杂的时候。因此我们要养成好习惯,把整个过程构建为一个脚本,以后只要运行这个脚本就能够完成全部步骤了。例如以下所看到的是PC-Linux版本号的madplay构建脚本。该脚本位于madplay工作文件夹的根文件夹下。
build-x86.sh
|
四、ARM-Linux(ARM版本号)
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
# 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字节)。可是运行时须要某些动态库。
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",改动后的脚本例如以下:
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