`
844604778
  • 浏览: 553066 次
文章分类
社区版块
存档分类
最新评论

nuc900上Madplay移植说明

 
阅读更多

nuc900上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中找到。

目前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 上开始。

(1).建立工作目录,复制源代码包

#mkdir madplay

#cd madplay

#mkdir tarball src-arm src-x86 target-arm target-x86

目录说明:

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 xzvf $f -C ../src-x86; done

(3)编译madplay依赖的库文件

MADPLAY_DIR=/extend/cjli/applications/madplay

SRC_DIR=src-x86

TARGET_DIR=$MADPLAY_DIR/target-x86

a)编译zlib

#cd ./$SRC_DIR/zlib-1.1.4

#./configure --prefix $TARGET_DIR

#make

#make install

b) libid3tag

#cd ./$SRC_DIR/libid3tag-0.15.1b

#./configure --prefix $TARGET_DIR

#make

#make install

c) libmad-

cd ./$SRC_DIR/libmad-0.15.1b

./configure --prefix $TARGET_DIR

make

make install

编译时出现错误:cc1: error: unrecognized command line option -fforce-mem

解决办法:

其实这个错误是编译安装libmad时候引起的,audacity包含libmad

解决方式

找到libmad configure之后的Makefile,

vi Makefile

找到包含"-fforce-mem"符串,将其删除,就ok

原因是gcc 3.4或者更高版本,已经将其去除了,所以会出现上面的错误!

以上过程完毕,将在 target-x86 目录出现编译madplay 所依赖的库文件和头文件

(4)madplay

cd ./$SRC_DIR/madplay-0.15.2b

./configure --prefix $TARGET_DIR CPPFLAGS=-I$TARGET_DIR/include LDFLAGS=-L$TARGET_DIR/lib

make

make install

如不设CPPFLAGSLDFLAGS会出现错误

执行完毕,可执行文件将被安装在我们指定的目录

#ls target-x86/bin

abxtest madplay

其中abxtest 是附加生成的测试程序,不必理会.

(5)测试pc版的madplay

拷贝一首mp3 文件到madplay 所在的目录,执行

#./madplay test.mp3

如果你的声卡已经正确安装,就可以听到mp3 的声音了。

如出现如下错误则是由于权限不够引起的.

audio: /dev/dsp: Permission denied

注意:如果一普通用户的角色运行mplayer,注意将该用户加入audio组。否则运行mplayer时会出现错误:can't open audio device ... /dev/dsp... permission denied

(6)

通过以上步骤,我们看到配置和编译不仅有一定的顺序,还需要注意一些安装细节,虽然这次编译通过了,但不免以后会忘记这个过程,特别是当程序更加复杂的时候,因此我们要养成好习惯,把整个过程构建为一个脚本,以后只要执行这个脚本就可以完成所有步骤了,如图所示是PC 版本madplay 的构建脚本,该脚本位于madplay 工作目录的根目录

#!/bin/bash

#This build script is for madplay under PC-Linux

MADPLAY_DIR=/extend/cjli/applications/madplay

SRC_DIR=src-x86

TARGET_DIR=$MADPLAY_DIR/target-x86

rm -rf $TARGET_DIR

mkdir $TARGET_DIR

cd ./$SRC_DIR/zlib-1.1.4

./configure --prefix $TARGET_DIR

make;make install

cd ../../

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 --enable-static

make

make install

cd ../../

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

既然我们已经构建了一个简单易用的编译脚本,现在就可以通过对它稍作修改来进行交叉编译了,这就是通常所说的移植。简单的移植只要重新指定一下编译器就可以了,可以通过修改环境变量来实现。很多的移植所要修改的环境变量是 CC 编译器,系统默认为gcc,AR 库工具,用以创建和修改库,系统默认ar LD 链接器,系统默认为LDRANLIB 随机库创建器,系统默认为ranlibAS 汇编器,系统默认为asNM 库查看工具,系统默认为nm还有一些不常用的其他环境变量,在此就不一一列举了。 需要注意的是,并不是每个移植都需要做全面的环境变量修改,有些是不需要改的,这要根据实际情况,也就是系统提示信息来调整。除了要修改编译器环境变量,一般还需要在配置中加入目标平台指定标识,在此为“arm-linux”,修改后的脚本如下:(将脚本放在madplay下)

#!/bin/bash

#This build script is for madplay under PC-Linux

MADPLAY_DIR=/extend/cjli/applications/madplay

SRC_DIR=src-arm

TARGET_DIR=$MADPLAY_DIR/target-arm

export CC=arm-linux-gcc

rm -rf $TARGET_DIR

mkdir $TARGET_DIR

cd ./$SRC_DIR/zlib-1.1.4

./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 --enable-static --disable-debugging --disable-shared

make

make install

cd ../../

cd ./$SRC_DIR/libmad-0.15.1b

./configure --host=arm-linux --prefix $TARGET_DIR --enable-static --disable-debugging --disable-shared

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 --enable-static --disable-debugging --disable-shared

make

make install

cd ../../

运行后生成madplay.大小为299k

这样生成的madplay需要依赖gcc的libiconv.so库.

0x00000001 (NEEDED) Shared library: [libm.so.6]
0x00000001 (NEEDED) Shared library: [libc.so.6]

如果想生成不依赖libiconv.so库的madplay的处理方法如下

  rm madplay拷贝make的最后一个连接的命令,在最后加上-static,并把libiconv.so改成libiconv.a,然后运行,就生成了不依赖libiconv.so的madplay大小为1488k.

最后一个连接命令如下:

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 -L/extend/cjli/applications/madplay/target-arm/lib ./intl/.libs/libintl.a -lc /usr/local/arm_linux_4.3/usr/arm-linux-uclibcgnueabi/lib/libiconv.so /extend/cjli/applications/madplay/target-arm/lib/libmad.a /extend/cjli/applications/madplay/target-arm/lib/libid3tag.a -lz -lm -Wl,--rpath -Wl,/usr/local/arm_linux_4.3/usr/arm-linux-uclibcgnueabi/lib -Wl,--rpath -Wl,/usr/local/arm_linux_4.3/usr/arm-linux-uclibcgnueabi/lib

修改后的为

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 -L/extend/cjli/applications/madplay/target-arm/lib ./intl/.libs/libintl.a -lc /usr/local/arm_linux_4.3/usr/arm-linux-uclibcgnueabi/lib/libiconv.a /extend/cjli/applications/madplay/target-arm/lib/libmad.a /extend/cjli/applications/madplay/target-arm/lib/libid3tag.a -lz -lm -Wl,--rpath -Wl,/usr/local/arm_linux_4.3/usr/arm-linux-uclibcgnueabi/lib -Wl,--rpath -Wl,/usr/local/arm_linux_4.3/usr/arm-linux-uclibcgnueabi/lib –static

(8)下载madplay 到开发板运行测试

为了区别于板子中已经存在的 madplay,我们把新做的改名为mymadplay,把它以及依赖库通过 ftp 下载到开发板,并作如下放置:

执行文件: mymadplay 放在 /usr目录 库文件放在/ lib 目录。

附录A:Madplay Arm编译的处理方法

(1)设定编译器环境变量
# export CC=arm-linux-gcc

(2)编译zlib,因为libid3tag依赖于这个库文件
# cd zlib-1.2.3
# ./configure --prefix=/opt/madplay/madplay
# make
# make install
或者:
打开/opt/madplay/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这个库。

附录B:检查动态链接的命令

使用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

arm-linux-readelf -d madplay

可以知道需要的动态库

Dynamic section at offset 0x3900c contains 25 entries:
Tag Type Name/Value
0x00000001 (NEEDED) Shared library: [libm.so.6]
0x00000001 (NEEDED) Shared library: [libc.so.6]

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics