madplay在arm平台的移植

ARM 90浏览

Author :Casy

Date: 2014/8/24

实验目的:

掌握Madplay移植方法。 

实验平台:

      Ubuntu 12.10  ,mini2440

一,准备源码和库(一共4个压缩包)

准备源代码可以到    ftp://ftp.mars.org/pub/mpeg/  (MAD (MPEG Audio Decoder) - Browse Filesat
SourceForge.nethttp://www.underbit.com/products/mad

http://sourceforge.net/projects/mad/files/)下载madplay-0.15.2b.tar.gz源代码和相关依赖包:

      madplay-0.15.2b.tar.gz

      libid3tag-0.15.1b.tar.gz

      libmad-0.15.1b.tar.gz

另外,还需要zlib库,请到http://www.gzip.org/zlib/下载。目前最新版本是zlib-1.2.8,下载软件包zlib-1.2.8.tar.gz

二,开始移植:

新建目录madplay,并以此为工作目录,并在该目

录中建立以下子目录,以存放不同的文件:

#cd /home

#mkdir madplay

#cd madplay

#mkdir raw-tarsrc-arm target-arm       

#MADPLAY_DIR=/home/madplay  //相当于宏定义路径变量

#SRC_DIR=$MADPLAY_DIR/src-arm

#TARGET_DIR=$MADPLAY_DIR/target-arm

目录说明:

raw-tar 目录用来存放所有的源代码包

src-arm 目录用来存放ARM 版本的所有源代码文件

target-arm 目录是ARM 版本的安装目录

接下来把从网上下载到的4个源代码包放入raw-tar 目录,然后解压:

$ tar -xzvf madplay-0.15.2b.tar.gz -C $SRC_DIR

$ tar -xzvflibid3tag-0.15.1b.tar.gz -C $SRC_DIR

$ tar -xzvflibmad-0.15.1b.tar.gz -C $SRC_DIR

$ tar -xzvfzlib-1.2.3.tar.gz -C $SRC_DIR

     

2.1编译安装zlib库 OK

进入生成的zlib-1.2.3目录。

使用configure命令配置库编译选项,包括C编译器、编译选项、链接选项和安装路径等。

$./configure  --prefix=$TARGET_DIR

--prefix 为”make install” 命令指引库的安装路径。

然后修改Makefile文件,一共有5处要修改

19 Line:

CC=arm-none-linux-gnueabi-gcc

30行:

LDSHARED=arm-none-linux-gnueabi-gcc

31行:

CPP=arm-none-linux-gnueabi-gcc–E

39:

AR=arm-none-linux-gnueabi-ar

41:

RANLIB=arm-none-linux-gnueabi-ranlib

然后, 用ARM编译工具交叉编译zlib

  $ make

生成 .a库和.so库,可以用make test 测试一下库,我操作的时候失败,原因是configure文件有些地方没改过来,但是用GCC编译生成的库测试成功;在此,并不影响使用。

安装库,将编译好的库安装到指定目录下。

  $ make install


2.2编译安装libid3tag解码库 OK

# ./configure CC=arm-linux-gcc--host=arm-linux --prefix=/home/madplay/target-armCPPFLAGS=-I/home/madplay/include LDFLAGS=-L/home/madplay/lib

  #make

 #make install

2.3 编译安装libmad-0.15.1b  OK

        使用configure命令配置库编译选项,包括C编译器、编译选项、链接选项和安装路径等。(注意:该步骤一定要指定编译器CC=arm-none-linux-gnueabi-gcc,否则make会出错!)

./configure--build=arm-linux CC=arm-none-linux-gnueabi-gcc --prefix=/home/madplay/target-arm

(可选参数:--enable-static --disable-shared)

用ARM编译工具交叉编译libmad-0.15.1b,

$ make  

如果你使用的是较高版本的arm-linux-gcc编译器, make 时会出现了“  cc1: error: unrecognizedmand line option "-fforce-mem" 错误,这是因为这个高版本的 gcc没有"-fforce-mem"参数,解的办法是在libmad 文件夹中的Makefile里面查找"-fforce-mem"
(129行),将其删除即可。

编译并安装库,将编译好的库安装到指定目录下。

$ make install

2.4  编译 主程序madplay-0.15.2b OK

#./configure  CC=arm-linux-gcc  --host=arm-linux--prefix=/home/madplay/target-arm  CPPFLAGS=-I/home/madplay/include  LDFLAGS=-L/home/madplay/lib

(可选的参数:--enable-static --disable-shared --with-pic--disable-debugging )

(实验:加上参数--enable-static --disable-shared),编译结果大小没有变,且仍然需要4个动态库。

--enable-static  --disable-shared 表示只使用静态库 ,不适用动态库

编译madplay,#make,即可在当前目录下生成madplay文件。

查看一下改可执行文件需要的动态库:

#arm-linux-readelf  -d madplay

输出运行时所需的4个动态库如下:

libmad.so.0 、libid3tag.so.0 、libm.so.6 、libc.so.6 。

将后两个文件从宿主机的/usr/lib 拷贝到开发板的/usr/lib 目录下(先查看开发板上是否存在,如果已经有了则不需要),但是我的Ubuntu12.10的/usr/lib下没有该文件!!!那就查找吧:# find / -name libc.so.6

# find / -name libm.so.6

前两个文件是在/madplay/target-arm/lib/ 下生成的,把这两个文件也拷贝到/usr/lib 下。

2.5 运行测试

文件都就绪了之后(可以nfs挂载,也可以ftfp传输),在开发板上# madplay -S -r TheSoundOfSilence.mp3

 


静态编译说明:

将静态库文件编译到程序中,运行时不需要动态库文件(这项生成的文件较动态编译的大)在配置libid3tag,libmad,madplay时,加上参数"--disable-shared --enable-static"即可静态编译madplay编译完成后,只需将madplay复制到根文件系统/usr/bin目录下,不需要复制动态库。 

三、构建编译脚本build-x86

上面一长串操作确实比较麻烦,尝试编写一个shell脚本,但是时间有限未完成,待续。。。。

# cat build-x86
#!/bin/sh
MADPLAY_DIR=$PWD
SRC_DIR=src-x86
TARGET_DIR=$MADPLAY_DIR/target-x86
#tar xvzf./tarball/libid3tag-0.15.1b.tar.gz -C $SRC_DIR
#tar xvzf./tarball/libmad-0.15.1b.tar.gz -C $SRC_DIR
#tar xvzf./tarball/madplay-0.15.2b.tar.gz -C $SRC_DIR
cd$SRC_DIR/libid3tag-0.15.1b
./configure--prefix=$TARGET_DIR
make;makeinstall
cd ../../
cd$SRC_DIR/libmad-0.15.1b
./configure--prefix=$TARGET_DIR
make;makeinstall
cd ../..
cd$SRC_DIR/madplay-0.15.2b
./configure--prefix=$TARGET_DIR CPPFLAGS=-I$TARGET_DIR/include LDFLAGS=-L$TARGET_DIR/lib
make;makeinstall
cd ../../