[Linux][Madplay播放器移植mini2440(ARM9)]
Madplay移植到mini2440全过程详解
madplay交叉编译
交叉编译器:arm-linux-gcc 3.4.1
PC环境:RedHat-6
注意:最好在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
[Linux][Madplay播放器移植mini2440(ARM9)]的更多相关文章
- OK6410移植madplay播放器,王明学learn
对于ok6410的madplay移植主要包括三部分.声卡驱动移植,播放器的移植,以及alsa库的移植. 一.首先移植声卡驱动以及播放器 ok6410采用WM97系列的声卡芯片,要使得内核支持该驱动,首 ...
- linux下播放器设计和开发
http://blog.csdn.net/henryjee/article/details/6737392 本文根据DawnLightPlayer的开发经验写成.DawnLithtPlayer是今天3 ...
- ffplay播放器移植VC的工程:ffplay for MFC
本文介绍一个自己做的FFPLAY移植到VC下的开源工程:ffplayfor MFC.本工程将ffmpeg项目中的ffplay播放器(ffplay.c)移植到了VC的环境下.并且使用MFC做了一套简单的 ...
- ffplay播放器移植VC的project:ffplay for MFC
本文介绍一个自己做的FFPLAY移植到VC下的开源project:ffplayfor MFC.本project将ffmpeg项目中的ffplay播放器(ffplay.c)移植到了VC的环境下.而且使用 ...
- ubuntu下一款有点感觉的 linux音乐播放器 clementine(小橘子))
https://www.clementine-player.org/ 在linux听音乐的感觉确实不是很好,音乐播放器很多.但是仅仅只是数量上的优势,在确实不是很好用.自带的rhythmbox确实很占 ...
- 超简单解决linux音乐播放器乱码问题
问题 中文MP3的tag信息有些因为采用了GBK编码, 导致linux下的大多播放器(Rhythmbox, Audacious)无法正确识别而显示乱码. 如下图Audacious的乱码情况. 网上的常 ...
- 基于tiny6410的madplay播放器的移植
在移植madplay之前需要先将所需要的库移植到开发板的文件系统中. 现在每个解压后的文件夹中创建一个文件夹 zlib-1.1.4.tar.gz 解压:tar xvzf zlib-1.1.4.tar ...
- 开源mp3播放器--madplay 编译和移植 简记
madplay是一款开源的mp3播放器. http://madplay.sourcearchive.com/ 下面简单记录一下madplay的编译与移植到ARM开发板上的过程 一.编译x86版本的ma ...
- 嵌入式mp3播放器
分四部分:按键驱动,声卡驱动,Madplay播放器移植,MP3主播放器处理 按键1:播放,按键2:停止,按键3:上一曲,按键4:下一曲 UA1341内核自带声卡驱动 .解压内核: tar zxvf l ...
随机推荐
- 记一次内存溢出的分析经历——thrift带给我的痛orz
说在前面的话 朋友,你经历过部署好的服务突然内存溢出吗? 你经历过没有看过Java虚拟机,来解决内存溢出的痛苦吗? 你经历过一个BUG,百思不得其解,头发一根一根脱落的烦恼吗? 我知道,你有过! 但是 ...
- Docker镜像的构成__Dockerfile
相比docker commit来说,Dockerfile的方法会更加自动化,更加方便快捷,而且功能也更强大.拿构建Nginx容器举例. 先创建一个目录 mkdir /opt/docker-file 进 ...
- 集成 solr6.5.1到 tomcat7(8) 中 (解决java.lang.NoSuchMethodError问题)
♣下载solr安装包 ♣安装solr ♣solr应用部署到tomcat下 ♣配置web.xml ♣在tomcat7启动 ♣改为在tomcat8启动 ♣在自带的Jetty里启动 ♣建立第一个Core 安 ...
- UVA - 11624 多点bfs [kuangbin带你飞]专题一
题意:某人身陷火场,总有k个点着火,着火点可向四周扩散,问此人能否逃离. 思路:可能有多个着火点,以这些着火点作为起点进行bfs,得到整个火场的最短距离,然后又以人所在坐标作为起点进行bfs,得到该人 ...
- windows系统php配置redis
网上各种找教程各种不行,最后东拼西凑的终于把redis弄出来了. PHP版本:7.1.0: Redis版本:3.2.10: Windows版本:Windows7: 一.Windows下安装Redis ...
- dojo页面调试出错
今天,我在调试dojo页面时,出现一些未定义的错误,这些错误只显示在引入的js的那一行,并没有指出是页面哪儿出问题了. 出现的问题一: neteaseTracker is not defined 出现 ...
- 安装coreseek cannot find input file: src/Makefile.in 错误解决方法
安装coreseek 出现了cannot find input file: src/Makefile.in 解决方法如下 >autoheader >automake --add-missi ...
- HighCharts之2D堆柱状图
HighCharts之2D堆柱状图 1.HighCharts之2D堆柱状图源码 Stacked.html: <!DOCTYPE html> <html> <head> ...
- visualSFM的使用方法
VisualSFM是Changchang Wu编写的使用 Structure from Motion (SfM)进行3D重建的交互界面,具体内容详见http://ccwu.me/vsfm/.本人电脑环 ...
- dpkg: error: -i (--install) 和 -i (--install) 两个操作之间有矛盾
1 错误描述 youhaidong@youhaidong-ThinkPad-Edge-E545:~$ sudo dpkg -i -i WineQQ2013-20131120-Longene.deb [ ...