构建嵌入式Linux应用系统 —— mp3播放器 madplay的移植

2019-07-12 15:38发布

我们的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);dotarxvzff –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所依赖的库文件和头文件。 clip_image004 (4)编译安装 madplay 如果我们还是像刚才那样配置编译选项: #cd madplay-0.15.2b #./configure –prefix=/work/system/madplay/target-x86 将会出现如图错误: clip_image006 提示找不到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 执行结果如下: clip_image010 这说明配置已经成功,生成了编译所需要的 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=ITARGET_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=ITARGET_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=ITARGET_DIR/include LDFLAGS=-L$TARGET_DIR/lib make;make install cd ../../ 现在我们直接运行一下该脚本,看结果,如图: clip_image012 根据提示,可以推断 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平台上的。如图: clip_image014 最后完整的编译脚本如下: #!/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=ITARGET_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=ITARGET_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目录。 执行结果如图所示: clip_image016 特别说明:本文源自友善之臂qq2440v3开发板的配套文档,只是做了少量修改,可视为原文的转载。在此对友善之臂公司致谢。 单击,与作者交流

3