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]