分享

mp3播放器madplay 移植过程详解

 renhl252 2015-07-10

1、环境

linux操作系统:fedora 10;

交叉编译器: arm-linux-gcc-4.3.3

目前madplay的官方网站是http://www./products/mad/,透过该网
站的介绍可以得知, 它还需要libmad 和libid3tag 两个库, 从该网站找到下载
连接http:///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

2、手动编译

#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  目录:

解压源代码包
#cd tarball
#for f in $(ls *.tar.gz); do tar xvzf $f –C ../src-x86; done

编译madplay  所依赖的库文件
a) libid3tag
#cd ../src-x86/libid3tag-0.15.1b
#./configure --prefix=/opt/GTStudio/GT2440/madplay/target-x86
#make
#make install
 
b) libmad
#cd ../libmad-0.15.1b
#./configure --prefix=/opt/GTStudio/GT2440/madplay/target-x86
#make
#make install
以上过程完毕,将在 target-x86  目录出现编译madplay 所依赖的库文件和头
文件。

编译安装madplay
 如果我们还是像刚才那样配置编译选项:
 #cd madplay-0.15.2b
 #./configure --prefix= /opt/GTStudio/GT2440/madplay/target-x86

提示我们在配置 madplay  之前要先安装libmad,因为我们之前已经编译并安
装了依赖库,根据提示我们要设置CPPFLAGS  环境变量,采用如下参数重新配
置:
  #./configure --prefix=/opt/GTStudio/GT2440/madplay/target-x86
CPPFLAGS=-I//opt/GTStudio/GT2440/madplay/target-x86/include

提示告诉我们还要设置 LDFLAGS 环境变量,因此再次修改配置参数如下:
 #./configure --prefix=/opt/GTStudio/GT2440/madplay/target-x86
CPPFLAGS=-I/opt/GTStudio/GT2440/madplay/target-x86/include
LDFLAGS=-L/opt/GTStudio/GT2440/madplay/target-x86/lib

这说明配置已经成功,生成了编译所需要的 Makefile 文件,输入一下命令
开始编译安装:
 #make
 #make install
 执行完毕, 可执行文件将被安装在我们指定的目录
/opt/GTStudio/GT2440/madplay/target-x86 目录中:
 #ls target-x86/bin
 abxtest madplay
其中abxtest  是附加生成的测试程序,不必理会。

测试PC 版的madplay
 拷贝一首mp3 文件到madplay  所在的目录,执行:
 #./madplay test.mp3
如果你的声卡已经正确安装,就可以听到mp3 的声音了。

3、构建编译脚本build-x86

[root@HeBi madplay]# cat build-x86
#!/bin/sh

MADPLAY_DIR=$PWD
SRC_DIR=src-x86
TARGET_DIR=$MADPLAY_DIR/target-x86

#tar xvzf ./tarball/libid3tag-0.15.1b.tar.gz -C $SRC_DIR 
#tar xvzf ./tarball/libmad-0.15.1b.tar.gz -C $SRC_DIR
#tar xvzf ./tarball/madplay-0.15.2b.tar.gz -C $SRC_DIR

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
make;make install
cd ../../
[root@HeBi madplay]#

在安装过程中会出现错误:

cc1: error: unrecognized command line option "-fforce-mem"
make[2]: *** [version.lo] 错误 1
make[2]: Leaving directory `/opt/GTStudio/GT2440/madplay/src-x86/libmad-0.15.1b'
make[1]: *** [all-recursive] 错误 1
make[1]: Leaving directory `/opt/GTStudio/GT2440/madplay/src-x86/libmad-0.15.1b'
make: *** [all] 错误 2
make  install-recursive

 

configure: error: mad.h was not found
*** You must first install libmad before you can build this package.
*** If libmad is already installed, you may need to use the CPPFLAGS
*** environment variable to specify its installed location, e.g. -I

.
make: *** 没有指明目标并且找不到 makefile。 停止。
make: *** 没有规则可以创建目标“install”。 停止。
[root@HeBi madplay]#

解决办法:

[root@HeBi madplay]# ls
build-arm  build-x86  src-arm  src-x86  tarball  target-arm  target-x86
[root@HeBi madplay]# cd src-x86/
[root@HeBi src-x86]# ls
libid3tag-0.15.1b  libmad-0.15.1b  madplay-0.15.2b
[root@HeBi src-x86]# cd libmad-0.15.1b/
[root@HeBi libmad-0.15.1b]# ls
aclocal.m4     config.sub    depcomp        imdct_s.dat     libtool      mkinstalldirs  synth.c
bit.c          configure     fixed.c        INSTALL         ltmain.sh    msvc++         synth.h
bit.h          configure.ac  fixed.h        install-sh      mad.h        qc_table.dat   timer.c
CHANGES        COPYING       frame.c        layer12.c       mad.h.sed    README         timer.h
config.guess   COPYRIGHT     frame.h        layer12.h       Makefile     rq_table.dat   TODO
config.h       CREDITS       global.h       layer3.c        Makefile.am  sf_table.dat   VERSION
config.h.in    D.dat         huffman.c      layer3.h        Makefile.in  stamp-h1       version.c
config.log     decoder.c     huffman.h      libmad.list     minimad.c    stream.c       version.h
config.status  decoder.h     imdct_l_arm.S  libmad.list.in  missing      stream.h       version.loT
[root@HeBi libmad-0.15.1b]# vi configure


/-fforce-mem

 

case "$optimize" in
        -O|"-O "*)
            optimize="-O"
            optimize="$optimize -fforce-mem"   //删掉-fforce-mem

//高版本编译器已经去除这项;

//所以编译不通过;
            optimize="$optimize -fforce-addr"

 

[root@HeBi madplay]# ls
build-arm  build-x86  src-arm  src-x86  tarball  target-arm  target-x86
[root@HeBi madplay]# vi build-x86

 


#tar xvzf ./tarball/libid3tag-0.15.1b.tar.gz -C $SRC_DIR
#tar xvzf ./tarball/libmad-0.15.1b.tar.gz -C $SRC_DIR
#tar xvzf ./tarball/madplay-0.15.2b.tar.gz -C $SRC_DIR  //注释这三行

 

[root@HeBi madplay]# ./build-x86

//重新编译;

[root@HeBi madplay]# cd target-x86/
[root@HeBi target-x86]# ls
bin  include  lib  man  share
[root@HeBi target-x86]# cd bin/
[root@HeBi bin]# ls
abxtest  madplay
[root@HeBi bin]# ./madplay /home/zhanghanzhong/CHINESE_HEART.MP3
MPEG Audio Decoder 0.15.2 (beta) - Copyright (C) 2000-2004 Robert Leslie et al.
          Title: ?μ?й
         Artist: ???
        Comment: ?V±|μ

//在PC机上播放音乐

4、构建编译脚本build-x86

同样的方法编译madplay;arm下需要zlib-1.2.3

[root@HeBi madplay]# cd src-arm/
[root@HeBi src-arm]# ls
libid3tag-0.15.1b  libmad-0.15.1b  madplay-0.15.2b  zlib-1.2.3
[root@HeBi src-arm]#

开发板下尝试MP3:

[root@ hebi /]# mount -t nfs -o nolock 192.168.1.103:/opt /mnt  //挂载NFS文件系统
[root@ hebi/]# cd /mnt/
[root@ hebi/mnt]# ls
GTStudio    TX44b0      lost+found
[root@zhanghanzhong /mnt]#

[root@ GT2440]# cd madplay/
[root@ madplay]# ls
build-arm   src-arm     tarball     target-x86
build-x86   src-x86     target-arm
[root@ hebi madplay]# cd target-arm/
[root@ hebi  target-arm]# ls
bin      include  lib      man      share
[root@ target-arm]# cd bin/
[root@ hebi bin]# ls
abxtest  madplay
[root@ hebi bin]# ./madplay /root/Documents/chinese_heart.mp3
./madplay: error while loading shared libraries: libid3tag.so.0: cannot open shared object file: No such file or directory
[root@ hebi bin]#

//从文件系统root_qtopia_2.2.0.tar.gz;

//找到libid3tag.so.0,并放到/lib目录下:
[root@ hebi GTStudio]# ls
GT2440          libid3tag.so.0
[root@ hebi GTStudio]# cp libid3tag.so.0  /lib/
[root@hebi  GTStudio]# madplay
Usage: madplay [OPTIONS] FILE [...]
Try `madplay --help' for more information.
[root@hebi  GTStudio]# madplay /root/Documents/chinese_heart.mp3
MPEG Audio Decoder 0.15.2 (beta) - Copyright (C) 2000-2004 Robert Leslie et al.
          Title: ?òμ??D1úD?
         Artist: ???÷??
        Comment: ò?à?±|μ?         //从终端复制过来,显示为乱码;

 查看需要的动态库:

[root@HeBi madplay]# cd target-arm/
[root@HeBi target-arm]# ls
bin  include  lib  man  share
[root@HeBi target-arm]# cd bin/
[root@HeBi bin]# ls
abxtest  madplay
[root@HeBi bin]# arm-linux-readelf -d madplay

方法二:

linux 查看可执行文件依赖的动态链接库

[root@HeBi lib]# arm-linux-objdump -x libm.so.6 | grep NEEDED
  NEEDED               ld-linux.so.2
  NEEDED               libc.so.6
[root@HeBi lib]#

 

 

Dynamic section at offset 0x1400c contains 29 entries:
  Tag        Type                         Name/Value
 0x00000001 (NEEDED)                     Shared library: [libmad.so.0]
 0x00000001 (NEEDED)                     Shared library: [libid3tag.so.0]
 0x00000001 (NEEDED)                     Shared library: [libm.so.6]
 0x00000001 (NEEDED)                     Shared library: [libgcc_s.so.1]
 0x00000001 (NEEDED)                     Shared library: [libc.so.6]
 0x0000000f (RPATH)                      Library rpath: [/opt/GTStudio/GT2440/madplay/target-arm/lib]
 0x0000000c (INIT)                       0x9830
 0x0000000d (FINI)                       0x19208
 0x00000019 (INIT_ARRAY)                 0x24000
 0x0000001b (INIT_ARRAYSZ)               4 (bytes)
 0x0000001a (FINI_ARRAY)                 0x24004
 0x0000001c (FINI_ARRAYSZ)               4 (bytes)
 0x00000004 (HASH)                       0x8168
 0x00000005 (STRTAB)                     0x8d30
 0x00000006 (SYMTAB)                     0x8500
 0x0000000a (STRSZ)                      1527 (bytes)
 0x0000000b (SYMENT)                     16 (bytes)
 0x00000015 (DEBUG)                      0x0
 0x00000003 (PLTGOT)                     0x2411c
 0x00000002 (PLTRELSZ)                   832 (bytes)
 0x00000014 (PLTREL)                     REL
 0x00000017 (JMPREL)                     0x94f0
 0x00000011 (REL)                        0x9490
 0x00000012 (RELSZ)                      96 (bytes)
 0x00000013 (RELENT)                     8 (bytes)
 0x6ffffffe (VERNEED)                    0x9430
 0x6fffffff (VERNEEDNUM)                 3
 0x6ffffff0 (VERSYM)                     0x9328
 0x00000000 (NULL)                       0x0
[root@HeBi bin]#

 

 

静态编译:

  加上:--disable-shared --enable-static

  即可把需要的库编译;而不需要动态库;

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多