分享

【转】Madplay移植

 guitarhua 2012-11-10

【转】Madplay移植-MINI2440

来源于网络 但修正许多BUG

ftp://ftp.mars.org/pub/mpeg/

这样我们就得到了移植 madplay 所需要的关键的四个文件:
madplay-0.15.2b.tar.gz
libmad-0.15.1b.tar.gz

libid3tag-0.15.1b.tar.gz

 zlib-1.2.3.tar.gz 


http://linux./soft/907.htm
zlibc的下载地址

我们就先在PC 上开始。

(1)建立工作目录,拷贝源代码包
在/opt/FriendlyARM/QQ2440 目录下建立madplay 目录,并以此为工作目录,并在该目
录中建立以下子目录,以存放不同的文件:
#cd /opt/FriendlyARM/QQ2440
#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 目录:
(2)解压源代码包
#cd tarball
#for f in $(ls *.tar.gz); do tar xvzf $f -C ../src-x86 ; done
(3)编译madplay 所依赖的库文件
a) libid3tag
#cd ../src-x86/libid3tag-0.15.1b
#./configure --prefix=/opt/FriendlyARM/QQ2440/madplay/target-x86
#make
#make install
b) libmad
#cd ../ libmad-0.15.1b
#./configure --prefix=/opt/FriendlyARM/QQ2440/madplay/target-x86
#make
#make install
以上过程完毕,将在 target-x86 目录出现编译madplay 所依赖的库文件和头文件。
(4)编译安装madplay
如果我们还是像刚才那样配置编译选项:
#cd madplay-0.15.2b
#./configure --prefix=/opt/FriendlyARM/QQ2440/madplay/target-x86 CPPFLAGS=-I/opt/FriendlyARM/QQ2440/madplay/target-x86/include LDFLAGS=-L/opt/FriendlyARM/QQ2440/madplay/target-x86/lib
执行结果如下:
这说明配置已经成功,生成了编译所需要的 Makefile 文件,输入一下命令开始编译安
装:
#make
#make install
执行完毕, 可执行文件将被安装在我们指定的目录
/opt/FriendlyARM/QQ2440/madplay/target-x86 目录中:
#ls target-x86/bin
abxtest madplay
其中abxtest 是附加生成的测试程序,不必理会。
(5)测试PC 版的madplay
拷贝一首mp3 文件到madplay 所在的目录,执行:
#./madplay test.mp3
如果你的声卡已经正确安装,就可以听到mp3 的声音了。
(6)构建编译脚本build-x86
通过以上步骤,我们看到配置和编译不仅有一定的顺序,还需要注意一些安装细节,
虽然这次编译通过了,但不免以后会忘记这个过程,特别是当程序更加复杂的时候,因此我
们要养成好习惯,把整个过程构建为一个脚本,以后只要执行这个脚本就可以完成所有步骤
了,如图所示是PC 版本madplay 的构建脚本,该脚本位于madplay 工作目录的根目录:
#!/bin/sh
#This build script is for madplay under PC-Linux
MADPLAY_DIR=/opt/FriendlyARM/QQ2440/madplay
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;make install
cd ../../
cd $SRC_DIR/libmad-0.15.1b
./configure --prefix=$TARGET_DIR
make;make install
cd ../..
cd $SRC_DIR/madplay-0.15.2b
./configure --prefix=$TARGET_DIR CPPFLAGS=-I$TARGET_DIR/include
LDFLAGS=-L$TARGET_DIR/lib
make;make install
cd ../../

下面开始交叉编译:

四、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

#!/bin/sh
# This build script is for madplay under ARM-Linux

MADPLAY_DIR=/opt/madplay
TARBALL_DIR=$MADPLAY_DIR/tarball
SRC_DIR=$MADPLAY_DIR/src-arm
TARGET_DIR=$MADPLAY_DIR/target-arm

tar -zxvf $TARBALL_DIR/zlib-1.2.3.tar.gz -C $SRC_DIR
tar -zxvf $TARBALL_DIR/libid3tag-0.15.1b.tar.gz -C $SRC_DIR
tar -zxvf $TARBALL_DIR/libmad-0.15.1b.tar.gz -C $SRC_DIR
tar -zxvf $TARBALL_DIR/madplay-0.15.2b.tar.gz -C $SRC_DIR

# for f in $(ls $TARBALL_DIR/*.tar.gz); do tar -zxvf $f -C $SRC_DIR; done

export CC=arm-linux-gcc

cd $SRC_DIR/zlib-1.2.3
./configure --prefix=$TARGET_DIR
make
make install

cd $SRC_DIR/libid3tag-0.15.1b
./configure --host=arm-linux --prefix=$TARGET_DIR --disable-debugging --disable-shared --enable-static CPPFLAGS=-I$TARGET_DIR/include LDFLAGS=-L$TARGET_DIR/lib
make
make install

cd $SRC_DIR/libmad-0.15.1b
./configure --host=arm-linux --prefix=$TARGET_DIR --disable-debugging --disable-shared --enable-static CPPFLAGS=-I$TARGET_DIR/include LDFLAGS=-L$TARGET_DIR/lib
make
make install

cd $SRC_DIR/madplay-0.15.2b
./configure --host=arm-linux --prefix=$TARGET_DIR --disable-debugging --disable-shared --enable-static CPPFLAGS=-I$TARGET_DIR/include LDFLAGS=-L$TARGET_DIR/lib
make
make install

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$TARGET_DIR/lib $TARGET_DIR/lib/libmad.a $TARGET_DIR/lib/libid3tag.a -lz -lm -static

mv madplay madplay-d
mv $TARGET_DIR/bin/madplay $TARGET_DIR/bin/madplay-d
cp -a madplay-s $TARGET_DIR/bin

 

如果出现问题,看一下提示:多半是路径问题和解压缩没有成功,自己稍微改动一下就可以了。

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。

功能很强大。

(7)构建并修正ARM 版本的编译脚本build-arm

既然我们已经构建了一个简单易用的编译脚本,现在就可以通过对它稍作修改来进行
交叉编译了,这就是通常所说的移植。简单的移植只要重新指定一下编译器就可以了,可以
通过修改环境变量来实现。很多的移植所要修改的环境变量是
CC 编译器,系统默认为gcc,
AR 库工具,用以创建和修改库,系统默认ar
LD 链接器,系统默认为LD
RANLIB 随机库创建器,系统默认为ranlib
AS 汇编器,系统默认为as
NM 库查看工具,系统默认为nm
还有一些不常用的其他环境变量,在此就不一一列举了。
需要注意的是,并不是每个移植都需要做全面的环境变量修改,有些是不需要改的,
这要根据实际情况,也就是系统提示信息来调整。
除了要修改编译器环境变量,一般还需要在配置中加入目标平台指定标识,在此为
“arm-linux”,完整的编译脚本如图:
#!/bin/sh
MADPLAY_DIR=/opt/FriendlyARM/QQ2440/madplay
SRC_DIR=src-arm
TARGET_DIR=$MADPLAY_DIR/target-arm
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
tar xvzf ./tarball/zlib-1.2.3.tar.gz -C $SRC_DIR
export CC=arm-linux-gcc
cd $SRC_DIR/zlib-1.2.3
./configure --prefix=$TARGET_DIR
make && make install
cd ../..
cd $SRC_DIR/libid3tag-0.15.1b
./configure --host=arm-linux --prefix=$TARGET_DIR CPPFLAGS=-I$TARGET_DIR/include
LDFLAGS=-L$TARGET_DIR/lib
make;make install
cd ../../
cd $SRC_DIR/libmad-0.15.1b
./configure --host=arm-linux --prefix=$TARGET_DIR
make;make install
cd ../..
cd $SRC_DIR/madplay-0.15.2b
./configure --host=arm-linux --prefix=$TARGET_DIR CPPFLAGS=-I$TARGET_DIR/include
LDFLAGS=-L$TARGET_DIR/lib
make;make install
cd ../../
(8)下载madplay 到开发板运行测试
为了区别于板子中已经存在的 madplay,我们把新做的改名为mymadplay,把它以及依
赖库通过 ftp 下载到开发板,并作如下放置:
执行文件:
mymadplay 放在 /usr/bin/目录
库文件:
libid3tag.a libid3tag.la libid3tag.so libid3tag.so.0
libid3tag.so.0.3.0 libmad.a libmad.la libmad.so
libmad.so.0 libmad.so.0.2.1 libz.a
放在/usr/lib 目录。
执行

注释:通过nfs拷贝容易出现问题,大文件会出错,用U盘拷贝也会出现问题,软连接无法拷贝。

        但是我再此使用U盘拷贝没有问题,只是开发版的触摸屏没有反应。

ftp在linux下的使用过程:
(1)在主机上开终端,
        #ftp SLAVE_IP登陆开发板,用户名密码都是plg,
        #bin ,修改传输类型;
(2)#put file* 
        此命令将file*传送到开发板的/home/plg目录下,把所有需要的lib文件以及bin文件;
        #by
(3)#minicom连上开发板,
   #cd /home/plg ,把所有传过来的文件转移到 /usr/lib和 /usr/bin下面去,
         #cd /usr/bin
         #madplay 00.mp3,运行。

另外一种编译方法:

1)用交叉编译工具编译zlib,并且把库生成到交叉编译环境的库目录下,我把它放到了/usr/local/madplayer目录下。

mkdir /usr/local/madplayer

./configure --prefix=/usr/local/madplayer
 修改Makefile文件:
 CC=arm-linux-gcc
 AR=arm-linux-ar rcs
 RANLIB=arm-linux-ranlib

make

make install

编译好之后就可以在上面prefix指定的目录下/usr/local/madplayer/lib目录下找到libz.a这个库。

2)编译libid3tag

执行以下操作

./configure CC=/usr/local/arm/3.4.1/bin/arm-linux-gcc --prefix=/usr/local/madplayer --host=arm-linux --disable-debugging --disable-shared --enable-static CPPFLAGS=-I/usr/local/madplayer/include LDFLAGS=-L/usr/local/madplayer/lib

其中,--disable-shared --enable-static是指定为静态编译。

make

make install

3)编译libmad

执行以下操作

./configure CC=/usr/local/arm/3.4.1/bin/arm-linux-gcc --prefix=/usr/local/madplayer --host=arm-linux --disable-debugging --disable-shared --enable-static CPPFLAGS=-I/usr/local/madplayer/include LDFLAGS=-L/usr/local/madplayer/lib

make

make install

4)编译madplay

./configure CC=/usr/local/arm/3.4.1/bin/arm-linux-gcc --prefix=/usr/local/madplayer --host=arm-linux --disable-debugging --disable-shared --enable-static CPPFLAGS=-I/usr/local/madplayer/include LDFLAGS=-L/usr/local/madplayer/lib

make

make install

把bin里面的和lib里面的拷贝到开发板,就可运行了。

如果这样:

执行以下的操作,在madplayer源码目录下面
arm-linux-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/usr/local9/arm/3.4.1/arm-linux/lib/libmad.a -L/usr/local9/arm/3.4.1/arm-linux/lib /usr/local/arm/3.4.1/arm-linux/lib/libid3tag.a -L/usr/local/arm/3.4.1/arm-linux/lib -lz -lm -static

文件夹下面将会生成madplayer静态编译的文件,大概900K,下载到开发板上面修改一下权限可以直接运行了

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多