我们的Linux系统开机时都会播放一首 mp3,这其中所用的播放器就是 madplay,下面我们介绍一下该播放器的详细移植过程。
说明:本文中所使用的交叉编译器版本为 arm-linux-gcc-3.4.5,为了还原一个真实的移植过程,本文从网络上搜索源代码开始。
目前madplay的官方网站是 http://www.underbit.com/products/mad/,透过该网站的介绍可以得知,它还需要 libmad和 libid3tag两个库,从该网站找到下载连接 http://sourceforge.net/project/showfiles.php?group_id=12349
这样我们就得到了移植 madplay所需要的关键的三个文件:
madplay-0.15.2b.tar.gz
libmad-0.15.1b.tar.gz
libid3tag-0.15.1b.tar.gz
它还会用到其他文件吗?只有天知道!一般都会遇到一些小麻烦,让我们继续吧。一般移植嵌入式应用软件的步骤是先在 PC上配置编译该软件并运行,以了解一下该软件的编译安装过程、用途、使用方法等。在PC上运行成功后,再将其移植到其它平台。现在我们就先在 PC上开始。
(1)建立工作目录,拷贝源代码包
在/work/system目录下建立 madplay目录,并以此为工作目录,并在该目录中建立以下子目录,以存放不同的文件:
#cd /work/system
#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);dotarxvzf f –C ../src-86 ; done
(3)编译 madplay所依赖的库文件
a) libid3tag
#cd ../src-x86/libid3tag-0.15.1b
#./configure –prefix=/work/system/madplay/target-x86
#make
#make install
b) libmad
#cd ../ libmad-0.15.1b
#./configure –prefix=/work/system/madplay/target-x86
#make
#make install
若出现找不到zlib.h的错误,则是由于你的Linux机器上还未安装zlib库,请按照“详解制作根文件系统”一文所述安装zlib库到你的Linux机器。
以上过程完毕,将在 target-x86目录出现编译 madplay所依赖的库文件和头文件。
(4)编译安装 madplay
如果我们还是像刚才那样配置编译选项:
#cd madplay-0.15.2b
#./configure –prefix=/work/system/madplay/target-x86
将会出现如图错误:
提示找不到mad.h头文件。出现这样的错误提示,是因为madplay依赖于libmad库,因此在配置madplay的时候,它会查找相关依赖库的头文件mad.h。因为我们之前已经编译并安装了依赖库,所以只需要根据提示设置 CPPFLAGS环境变量,指向mad.h头文件所在的位置即可。采用如下参数重新配置:
#./configure –prefix=/work/system/madplay/target-x86 CPPFLAGS=-I/work/system /madplay/target-x86/include
提示找不到libmad库文件。出现这样的错误提示,是因为madplay依赖于libmad库,因此在配置madplay的时候,它会查找相关依赖库的库文件libmad.so。因为我们之前已经编译并安装了依赖库,所以只需要根据提示设置
LDFLAGS环境变量,指向libmad.so库文件所在的位置即可。因此再次修改配置参数如下:
./configure –prefix=/work/system/madplay/target-x86 CPPFLAGS=-I/work/system/madplay/target-x86/include LDFLAGS=-L/work/system/madplay/target-x86/lib
执行结果如下:
这说明配置已经成功,生成了编译所需要的 Makefile文件,输入一下命令开始编译安装:
#make
#make install
执行完毕,可执行文件将被安装在我们指定的目录/work/system/madplay/target-x86目录中:
#cd /work/system/madplay
#ls target-x86/bin
abxtest madplay
其中 abxtest是附加生成的测试程序,不必理会。
(5)测试 PC版的 madplay
拷贝一首 mp3文件到 madplay所在的目录,执行: #./madplay test.mp3。 如果你的声卡已经正确安装,就可以听到 mp3的声音了。
(6)构建编译脚本 build-x86
通过以上步骤,我们看到配置和编译不仅有一定的顺序,还需要注意一些安装细节,虽然这次编译通过了,但不免以后会忘记这个过程,特别是当程序更加复杂的时候。因此我们要养成好习惯,把整个过程构建为一个脚本,以后只要执行这个脚本就可以完成所有步骤了,如图所示是 PC版本 madplay的构建脚本,该脚本位于 madplay工作目录的根目录:
#!/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;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= TARGETDIRCPPFLAGS=−I TARGET_DIR/include LDFLAGS=-L$TARGET_DIR/lib
make;make install
cd ../../
(7)构建并修正 ARM版本的编译脚本 build-arm
既然我们已经构建了一个简单易用的编译脚本,现在就可以通过对它稍作修改来进行交叉编译了,这就是通常所说的移植。简单的移植只要重新指定一下编译器就可以了,可以通过修改环境变量来实现。很多的移植所要修改的环境变量是
CC 编译器,系统默认为 gcc,需要修改为arm-linux-gcc
AR 库工具,用以创建和修改库,需要修改为arm-linux-ar
LD 链接器,系统默认为 LD,需要修改为arm-linux-ld
RANLIB 随机库创建器,系统默认为 ranlib,需要修改为arm-linux-ranlib
AS 汇编器,系统默认为 as,需要修改为arm-linux-as
NM 库查看工具,系统默认为 nm,需要修改为arm-linux-nm
还有一些不常用的其他环境变量,在此就不一一列举了。需要注意的是,并不是每个移植都需要做全面的环境变量修改,有些是不需要改的,这要根据实际情况,也就是系统提示信息来调整。
除了要修改编译器环境变量,我们还必须保证编译出来的应用程序(或者链接库)必须是运行在ARM平台上,而不是I386平台上。这一般需要在使用configure程序进行配置时,加入目标平台指定标识,一般的做法是 “./configure –host=arm-linux”,修改后的脚本如下:
#!/bin/sh
MADPLAY_DIR=$PWD
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
export CC=arm-linux-gcc
cd $SRC_DIR/libid3tag-0.15.1b
./configure –host=arm-linux –prefix= TARGETDIRCPPFLAGS=−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= TARGETDIRCPPFLAGS=−I TARGET_DIR/include LDFLAGS=-L$TARGET_DIR/lib
make;make install
cd ../../
现在我们直接运行一下该脚本,看结果,如图:
根据提示,可以推断 libid3tag库没有被正确编译出来,再根据更上的提示信息,我们得知该库还依赖于一个叫做“ zlib”的库,为什么 PC版本的没有这个问题呢,是因为我们所使用的 PC Linux系统中已经有了这个库,但运行在ARM平台上的zlib库还没有。因此我们从网上搜索到该库的源代码包,下载下来放到 tarball目录中,并在编译脚本中参考其他库在相应位置加入以下部分:
tar xvzf ./tarball/zlib-1.2.3.tar.gz -C $SRC_DIR
cd $SRC_DIR/zlib-1.2.3
./configure –prefix=$TARGET_DIR
make && make install
cd ../..
再次执行编译脚本,这次顺利编译通过,最后在 target-arm/bin目录中可以看到交叉编译生成的 madplay,使用 file命令检查一下,可见现在编译出来的madplay的确是运行在ARM平台上的。如图:
最后完整的编译脚本如下:
#!/bin/sh
MADPLAY_DIR=$PWD
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= TARGETDIRCPPFLAGS=−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= TARGETDIRCPPFLAGS=−I TARGET_DIR/include LDFLAGS=-L$TARGET_DIR/lib
make;make install
cd ../../
(8)下载 madplay到开发板运行测试
把它以及依赖库下载到开发板,并作如下放置:
执行文件: madplay 放在 /usr/bin/目录
库文件:libid3tag.so.0、libid3tag.so.0.3.0、libmad.so.0、libmad.so.0.2.1放在/usr/lib目录。
执行结果如图所示:
特别说明:本文源自友善之臂qq2440v3开发板的配套文档,只是做了少量修改,可视为原文的转载。在此对友善之臂公司致谢。
单击,与作者交流