Chinaunix首页 | 论坛 | 博客
  • 博客访问: 102140
  • 博文数量: 25
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 197
  • 用 户 组: 普通用户
  • 注册时间: 2014-06-01 20:34
个人简介

当你开始做一键事情时,要问问自己是不是三分钟的热度

文章分类

全部博文(25)

文章存档

2016年(1)

2015年(24)

我的朋友

分类: LINUX

2015-09-22 00:40:04

本文参考至:http://blog.chinaunix.net/uid-20539088-id-115750.html

移植前的准备:
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。其中前面的三个包可以在 style="color:#666666;font-family:宋体, Arial;font-size:large;line-height:26px;white-space:normal;background-color:#FFFFFF;">中下载,后一个包可以在 style="color:#666666;font-family:宋体, Arial;font-size:large;line-height:26px;white-space:normal;background-color:#FFFFFF;">中找到。    

正式开始移植:
1、解压源代码包
在/opt目录下新建一个文件夹madplay,然后将下载好的四个压缩包放到新建的madplay目录下。
执行以下命令:
# cd /opt/madplay/
# tar -zxvf zlib-1.2.3.tar.gz
# tar -zxvf libid3tag-0.15.1b.tar.gz
# tar -zxvf libmad-0.15.1b.tar.gz
# tar -zxvf madplay-0.15.2b.tar.gz

2、编译madplay及其所依赖的库文件

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

(2)编译zlib,因为libid3tag依赖于这个库文件
# cd ./zlib-1.2.3
# mkdir _install
# ./configure --shared --prefix=/opt/madplay/zlib-1.2.3/_install

打开当前目录下的Makefile文件,按以下内容修改并保存:
CC=arm-linux-gcc
LDSHARED=arm-linux-gcc -shared -Wl, soname,libz.so.1
CPP=arm-linux-gcc -E

AR=arm-linux-ar rcs
RANLIB=arm-linux-ranlib

# make
# make install
编译好之后就可以在上面prefix指定目录下的lib目录下找到相对应的库。

(3)编译libid3tag
# cd ../libid3tag-0.15.1b
# ./configure --host=arm-linux --prefix=/opt/madplay/libid3tag-0.15.1b/_install --disable-debugging --disable-shared --enable-static CPPFLAGS=-I/opt/madplay/target-arm/include LDFLAGS=-L/opt/madplay/target-arm/lib(红色字体的配置为可有可无)
# make
# make install
编译好之后就可以在上面prefix指定目录下的lib目录下找到相对应的库。

(4)编译libmad
# cd ../libmad-0.15.1b
# ./configure --host=arm-linux --prefix=/opt/madplay/libmad-0.15.1b/_install --disable-debugging --disable-shared --enable-static CPPFLAGS=-I/opt/madplay/target-arm/include LDFLAGS=-L/opt/madplay/target-arm/lib(红色字体的配置为可有可无)
# make
# make install
编译好之后就可以在上面prefix指定目录下的lib目录下找到相对应的库。

(5)编译madplay
# cd ../madplay-0.15.2b
# ./configure --host=arm-linux --prefix=/opt/madplay/madplay-0.15.2b//_install --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)静态链接
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到开发板运行测试
执行文件mymadplay放在/usr/bin/目录,库文件:/opt/madplay/zlib-1.2.3/_install/lib/下所有库文件、/opt/madplay/libid3tag-0.15.1b/_install/lib/下所有库文件、/opt/madplay/libmad-0.15.1b/_install/lib/下所有库文件、libm.so.6和libc.so.6放在/usr/lib目录,当然如果是静态链接的可执行程序就不用拷贝库文件了。
拷贝一首mp3文件到开发板上,然后执行mymadplay进行测试。
在执行madplay时提示Illegal instruction,经过检查发现实库文件拷贝原来是libm.so.6和libc.so.6这两个库文件使用错误,真正要拷贝的这两个库文件应该是在/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib/下而不是在/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/lib/下




阅读(2027) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~