本文转载自:https://blog.csdn.net/simanstar/article/details/24035379

madplay交叉编译

交叉编译器:arm-linux-gcc 3.4.1
PC环境:Ubuntu 8.10

注意:最好在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

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

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

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

cd $SRC_DIR/zlib-1.2.3
./configure --prefix=$TARGET_DIR
make
make install
cd $SRC_DIR/libid3tag-0.15.1b
./configure --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 --prefix=$TARGET_DIR --disable-debugging --disable-shared --enable-static CPPFLAGS=-I$TARGET_DIR/include LDFLAGS=-L$TARGET_DIR/lib

sed 's/-fforce-mem //g' Makefile > Makefile.bak
mv Makefile.bak Makefile

make
make install

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

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

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

功能很强大。

我用QT和madplay做了一个MP3播放器。稍后放出源代码。

Madplay移植到mini2440开发板【转】的更多相关文章

  1. 【转】Vsftpd-3.0.2服务器arm-linux移植—mini2440开发板

    Vsftpd-3.0.2服务器arm-linux移植—mini2440开发板 开发板:mini2440(2011.04.21)环境:ubuntu9.10 为方便的将文件上传到开发板,采用vsftpd, ...

  2. 【原创】车载实时路况信息接收终端移植于Smart210开发板 --- 综合教程

    [原创]车载实时路况信息接收终端移植于Smart210开发板 --- 综合教程 所用工具: windows电脑 Ubuntu12.04 Smart210开发板 4g以上SD卡 U盘 步骤: 1.    ...

  3. linux 3.4.103 内核移植到 S3C6410 开发板 移植失败 (问题总结,日本再战!)

    linux 3.4.103 内核移植到 S3C6410 开发板 这个星期差点儿就搭在这里面了,一開始感觉非常不值得,移植这样的浪费时间的事情.想立刻搞定,然后安安静静看书 & coding. ...

  4. Opencv2.2 移植到am335x-y开发板

    1.虚拟机上运行cmake-gui,报找不到文件,指示安装. 2.下载opencv2.2.0 http://opencv.org/downloads.html 3.cmake-gui,配置参考< ...

  5. 【基于mini2440开发板的交叉编译环境及内核树配置.

    在学习linux驱动开发过程中,交叉编译环境的配置及内核树的生成无疑是对linux不是十分了解的新人面前的一堵墙.高高大大的墙...笔者在初探这一方向时,就在这2个问题上苦恼了很久.查阅无数资料,大多 ...

  6. linux-3.0内核移植到fl2440开发板(以MINI2440为模板)

    我们的fl2440开发板使用的是s3c2440的芯片,与MINI2440十分相似,因此需要改动的地方不多,移植也比较容易. 1.[weishusheng@localhost kernel]$ sudo ...

  7. MPlayer在ARM上的移植(S5PV210开发板)

    MPlayer 1.0已经把大部分解码库都自带了,如ffmpeg,但是自带的音频库在S5PV210下效果非常不好.换成使用libmad效果不错.因此MPlayer 在ARM-Linux的最简单的移植只 ...

  8. 移植net-snmp到开发板(mini210)

    1.安装交叉编译工具arm-linux-gcc 2.下载net-snmp源码安装包 3.解压安装包 4../configure --build=i686-linux --host=arm-linux ...

  9. Mplayer1.0rc2移植到am335x开发板

    因项目需要媒体播放器,所以准备使用QT+Mplayer来做,但遇到了屏幕闪烁的问题,无法满足需求. 1.参考<mplayer 移植到 arm 心得> ,http://blog.csdn.n ...

随机推荐

  1. npm安装express 公司上网设置代理

    异常: 0 info it worked if it ends with ok1 verbose cli [ 'C:\\Program Files (x86)\\nodejs\\\\node.exe' ...

  2. 第一只python爬虫

    import urllib.request response = urllib.request.urlopen("http://www.baidu.com") html = res ...

  3. URAL 2040 Palindromes and Super Abilities 2(回文树)

    Palindromes and Super Abilities 2 Time Limit: 1MS   Memory Limit: 102400KB   64bit IO Format: %I64d ...

  4. 观《phonegap第三季 angularjs+ionic视频教程 实时发布》学习笔记(三)

    十五.ionic路由 1.ionic中内联模板介绍 使用内联模板内联模板的使用,常见的有几种情况.(1) 使用ng-include指令可以利用ng-include指令在HTML中直接使用内联模板,例如 ...

  5. Java基础系列(八)序列化与反序列化

    先来看两个例子 示例一:将对象保存成字节数组,再把对象的字节数组还原为对象 示例中用到的Bean package com.huawei.beans; import java.io.Serializab ...

  6. Golang Frameworks

    Web frameworks help developers build applications as easily and quickly as possible. Go is still rel ...

  7. Compilation failed: internal java compiler error

    在Idea中编译时出现这个错误:Error:java: Compilation failed: internal java compiler error. Information:Using java ...

  8. 常见面试题整理--Python概念篇

    希望此文可以长期更新并作为一篇Python的面试宝典.每一道题目都附有详细解答,以及更加详细的回答链接.此篇是概念篇,下一篇会更新面试题代码篇. (一).这两个参数是什么意思:*args,**kwar ...

  9. C++对象模型那点事儿(布局篇)

    1 前言 在C++中类的数据成员有两种:static和nonstatic.类的函数成员由三种:static,nonstatic和virtual. 上篇我们尽量说一些宏观上的东西,数据成员与函数成员在类 ...

  10. Java基础—枚举

    定义 枚举(enum)类型是Java 5新增的特性,它是一种新的类型,允许用常量来表示特定的数据片断,而且全部都以类型安全的形式来表示. 为什么要用枚举 在java语言中还没有引入枚举类型之前,表示枚 ...