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
如不设CPPFLAGS和LDFLAGS会出现错误
执行完毕,可执行文件将被安装在我们指定的目录
#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]
分享到:
相关推荐
NUC900 Series MCU Programming Guide
nuc900平台u-boot的相关资料支持yaffs2文件系统,支持2k+64的nandflash,暂时不能与sd卡驱动同时使用.
新唐nuc900系列用bootloadder,用于nuc900的norflash boot,可用来引导linux和no-os程序.
nuc900的turbowriter最新驱动程序,支持nuc950,nuc910,nuc951等.
英特尔NUC 11 NUC11PAH 硬件说明书 板载USB2.0+USB3.0 Header,Single USB2.0 HeaderRGB Header……
针对nuc900系列芯片修改的u-boot代码,适用于nuc910/950/951等芯片,运行在nand flash上.
This is NUC900 Stand-alone LIB API14 sample code for IT expert.
nuc900 rtc interrupt for Linux v2.13.6.
RT-Thread V4.0.1在NUC972单片机上的移植。
jpg jpeg格式
一、程序有三个任务: 第一演示emwin,用的屏分辨率为1024*600,其它分辨率可在LCDCONF.h里配置; 第二个跑LwIP,DHCP获取IP后,可用其它设备Ping本机; 第三个为USB键盘接入任务,可识别USB键盘、USB扫描枪;
基于新唐nuc972的ec20的4G模块移植说明和驱动源代码
NUC970的开发手册,英文版。详细介绍了NUC970的资源使用。
NUC970上电boot启动
骨伽红眼NUC9 红眼峡谷NUC9英特尔NUC主机EFI黑苹果引导下载
NUC970_Datasheet NUC970_Product NUC970_TechnicalReferenceManual_EN
NuMicro® NUC029系列包括4个型号:NUC029LAN, NUC029ZAN, NUC029TAN 及 NUC029FAE NUC029LAN/NUC029ZAN/NUC029TAN最高可运行到50MHz, 工作电压2.5V ~ 5.5V,温度-40℃ ~ 85℃;NUC029FAE最高可运行到24MHz,工作...
BCM63xx UDC high full speed USB device controller for Linux v2.13.6.
TX A-MPDU aggregation for Linux v2.13.6.