Madplay移植到OK6410全過程詳解

madplay交叉編譯

交叉編譯器:arm-linux-gcc 4.3.2
PC環境:Red Hat 5.4

注意:最好在root權限下執行以下移植,否則在make install時可能權限不夠。

一、移植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中找到。

注意:一般移植嵌入式應用軟件的步驟是先在PC上配置編譯該軟件並運行,以瞭解一下該軟件的用途和使用方法等,現在就讓我們先在PC上開始吧。

二、建立工作目錄,拷貝源代碼包

在/opt/madplay目錄下建立madplay目錄,並以此爲工作目錄,並在該目錄中建立以下子目錄,以存放不同的文件:
# cd /opt
# 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目錄。

三、PC-Linux(PC版本)

1、解壓源代碼包
# cd tarball
# for f in $(ls *.tar.gz); do tar -zxvf $f –C ../src-x86; done
或者:
# cd tarball
# tar -zxvf zlib-1.2.3.tar.gz -C ../src-x86
# tar -zxvf libid3tag-0.15.1b.tar.gz -C ../src-x86
# tar -zxvf libmad-0.15.1b.tar.gz -C ../src-x86
# tar -zxvf madplay-0.15.2b.tar.gz -C ../src-x86

2、編譯madplay及其所依賴的庫文件

(1)編譯zlib,因爲libid3tag依賴於這個庫文件
# cd ../src-x86/zlib-1.2.3
# ./configure --prefix=/opt/madplay/target-x86
# make
# make install

編譯好之後就可以在上面prefix指定目錄下的lib目錄下找到libz.a這個庫。

(2)編譯libid3tag
# cd ../libid3tag-0.15.1b
# ./configure --prefix=/opt/madplay/target-x86 --disable-debugging --disable-shared --enable-static CPPFLAGS=-I/opt/madplay/target-x86/include LDFLAGS=-L/opt/madplay/target-x86/lib
# make
# make install

其中,--disable-shared --enable-static是指定爲靜態編譯,不過這樣並不能夠進行靜態編譯。至於爲什麼,有待於繼續研究。

(3)編譯libmad
# cd ../libmad-0.15.1b
# ./configure --prefix=/opt/madplay/target-x86 --disable-debugging --disable-shared --enable-static CPPFLAGS=-I/opt/madplay/target-x86/include LDFLAGS=-L/opt/madplay/target-x86/lib

注意:如果此時make,make install就會報錯,說是"-fforce-mem"參數不能識別。不知道是什麼原因,然後就在網上查了一通,好像說是我機器環境的gcc版本(我的是gcc 4.3.2)過高導致的,所以不能識別其中的"-fforce-mem"參數選項,真是搞不懂,版本高還識別不了。。。
於是乎就打開當前目錄下的Makefile文件,去掉裏面出現的"-fforce-mem",然後再make,make install就OK了。

(4)編譯madplay
# cd ../madplay-0.15.2b
# ./configure --prefix=/opt/madplay/target-x86 --disable-debugging --disable-shared --enable-static CPPFLAGS=-I/opt/madplay/target-x86/include LDFLAGS=-L/opt/madplay/target-x86/lib
# make
# make install

但是,這樣得到的是動態鏈接。如果在madplay-0.15.2b目錄中執行gcc命令,並且在最後加上-static,運行以後就可以得到靜態鏈接的程序,如(5)所示。

(5)靜態鏈接
# 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/opt/madplay/target-x86/lib /opt/madplay/target-x86/lib/libmad.a /opt/madplay/target-x86/lib/libid3tag.a -lz -lm -static

執行完畢後,動態鏈接執行文件將被安裝在我們指定的目錄中:/opt/madplay/target-x86
靜態鏈接執行文件將被安裝在我們當前的目錄中:/opt/madplay/src-x86/madplay-0.15.2b
# ls /opt/madplay/target-x86/bin
abxtest madplay
其中abxtest是附加生成的測試程序,不必理會。

使用file命令檢查一下:
# file /opt/madplay/target-x86/bin/madplay
/opt/madplay/target-x86/bin/madplay: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped

# file /opt/madplay/src-x86/madplay-0.15.2b/madplay
/opt/madplay/src-x86/madplay-0.15.2b/madplay: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped
上面的信息顯示了我們編譯得到的兩個鏈接執行程序:動態鏈接和靜態鏈接。

# arm-linux-readelf -d /opt/madplay/target-x86/bin/madplay
輸出一大堆信息,最上面顯示了動態鏈接編譯所需的動態庫:libm.so.6和libc.so.6。

靜態鏈接文件大小爲862.8KB(883531字節),動態鏈接文件大小僅僅爲279.5KB(286206字節),但是運行時需要某些動態庫。

3、測試PC-Linux版本的madplay
拷貝一首mp3文件到madplay所在的目錄,執行:
# ./madplay test.mp3
如果你的聲卡已經正確安裝,就可以聽到mp3 的聲音了。

4、構建Shell編譯腳本build-x86.sh
通過以上步驟,我們看到配置和編譯不僅有一定的順序,還需要注意一些安裝細節,雖然這次編譯通過了,但不免以後會忘記這個過程,特別是當程序更加複雜的時候,因此我們要養成好習慣,把整個過程構建爲一個腳本,以後只要執行這個腳本就可以完成所有步驟了,如下所示是PC-Linux版本的madplay構建腳本,該腳本位於madplay工作目錄的根目錄下。

build-x86.sh

#!/bin/sh
# This build script is for madplay under PC-Linux

MADPLAY_DIR=/opt/madplay
TARBALL_DIR=$MADPLAY_DIR/tarball
SRC_DIR=$MADPLAY_DIR/src-x86
TARGET_DIR=$MADPLAY_DIR/target-x86

tar -zxvf $TARBALL_DIR/zlib-1.2.3.tar.gz -C $SRC_DIR
tar -zxvf $TARBALL_DIR/libid3tag-0.15.1b.tar.gz -C $SRC_DIR
tar -zxvf $TARBALL_DIR/libmad-0.15.1b.tar.gz -C $SRC_DIR
tar -zxvf $TARBALL_DIR/madplay-0.15.2b.tar.gz -C $SRC_DIR

# for f in $(ls $TARBALL_DIR/*.tar.gz); do tar -zxvf $f -C $SRC_DIR; done

cd $SRC_DIR/zlib-1.2.3
./configure --prefix=$TARGET_DIR
make
make install
cd $SRC_DIR/libid3tag-0.15.1b
./configure --prefix=$TARGET_DIR --disable-debugging --disable-shared --enable-static CPPFLAGS=-I$TARGET_DIR/include LDFLAGS=-L$TARGET_DIR/lib
make
make install

cd $SRC_DIR/libmad-0.15.1b
./configure --prefix=$TARGET_DIR --disable-debugging --disable-shared --enable-static CPPFLAGS=-I$TARGET_DIR/include LDFLAGS=-L$TARGET_DIR/lib

sed 's/-fforce-mem //g' Makefile > Makefile.bak
mv Makefile.bak Makefile

make
make install

cd $SRC_DIR/madplay-0.15.2b
./configure --prefix=$TARGET_DIR --disable-debugging --disable-shared --enable-static CPPFLAGS=-I$TARGET_DIR/include LDFLAGS=-L$TARGET_DIR/lib
make
make install

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$TARGET_DIR/lib $TARGET_DIR/lib/libmad.a $TARGET_DIR/lib/libid3tag.a -lz -lm -static

mv madplay madplay-d
mv $TARGET_DIR/bin/madplay $TARGET_DIR/bin/madplay-d
cp -a madplay-s $TARGET_DIR/bin

 

四、ARM-Linux(ARM版本)

1、解壓源代碼包
# cd tarball
# for f in $(ls *.tar.gz); do tar -zxvf $f –C ../src-arm; done
或者:
# cd tarball
# tar -zxvf zlib-1.2.3.tar.gz -C ../src-arm
# tar -zxvf libid3tag-0.15.1b.tar.gz -C ../src-arm
# tar -zxvf libmad-0.15.1b.tar.gz -C ../src-arm
# tar -zxvf madplay-0.15.2b.tar.gz -C ../src-arm

2、編譯madplay及其所依賴的庫文件

(1)設定編譯器環境變量
# export CC=arm-linux-gcc

(2)編譯zlib,因爲libid3tag依賴於這個庫文件
# cd ../src-arm/zlib-1.2.3
# ./configure --prefix=/opt/madplay/target-arm
# make
# make install
或者:
打開/opt/madplay/src-arm/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這個庫。

(3)編譯libid3tag
# cd ../libid3tag-0.15.1b
# ./configure --host=arm-linux --prefix=/opt/madplay/target-arm --disable-debugging --disable-shared --enable-static CPPFLAGS=-I/opt/madplay/target-arm/include LDFLAGS=-L/opt/madplay/target-arm/lib
# make
# make install

(4)編譯libmad
# cd ../libmad-0.15.1b
# ./configure --host=arm-linux --prefix=/opt/madplay/target-arm --disable-debugging --disable-shared --enable-static CPPFLAGS=-I/opt/madplay/target-arm/include LDFLAGS=-L/opt/madplay/target-arm/lib
# make
# make install

(5)編譯madplay
# cd ../madplay-0.15.2b
# ./configure --host=arm-linux --prefix=/opt/madplay/target-arm --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)所示。

(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
/opt/madplay/target-arm/bin/madplay: ELF 32-bit LSB executable, ARM, version 1 (SYSV), for GNU/Linux 2.6.14, dynamically linked (uses shared libs), for GNU/Linux 2.6.14, not stripped

# file /opt/madplay/src-arm/madplay-0.15.2b/madplay
/opt/madplay/src-arm/madplay-0.15.2b/madplay: ELF 32-bit LSB executable, ARM, version 1 (SYSV), for GNU/Linux 2.6.14, dynamically linked (uses shared libs), for GNU/Linux 2.6.14, 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到開發板運行測試
爲了區別於板子中已經存在的madplay,我們把新做的改名爲mymadplay,把它以及依賴庫通過FTP或者NFS方式下載到開發板,並作如下放置:
執行文件mymadplay放在/usr/bin/目錄,庫文件:libm.so.6和libc.so.6放在/usr/lib目錄,當然如果是靜態鏈接的可執行程序就不用拷貝庫文件了。
拷貝一首mp3文件到開發板上,然後執行mymadplay進行測試。

4、構建並修正ARM版本的編譯腳本build-arm.sh
既然我們已經構建了一個簡單易用的編譯腳本,現在就可以通過對它稍作修改來進行交叉編譯了,這就是通常所說的移植。簡單的移植只要重新指定一下編譯器就可以了,可以通過修改環境變量來實現。很多的移植所要修改的環境變量是:
CC:編譯器,系統默認爲gcc
AR:庫工具,用以創建和修改庫,系統默認ar
LD:鏈接器,系統默認爲LD
RANLIB:隨機庫創建器,系統默認爲ranlib
AS:彙編器,系統默認爲as
NM:庫查看工具,系統默認爲nm

還有一些不常用的其他環境變量,在此就不一一列舉了。

需要注意的是,並不是每個移植都需要做全面的環境變量修改,有些是不需要改的,這要根據實際情況,也就是系統提示信息來調整。
除了要修改編譯器環境變量,一般還需要在配置中加入標平臺指定標識,在此爲"arm-linux",修改後的腳本如下:

build-arm.sh

#!/bin/sh
# This build script is for madplay under ARM-Linux

MADPLAY_DIR=/opt/madplay
TARBALL_DIR=$MADPLAY_DIR/tarball
SRC_DIR=$MADPLAY_DIR/src-arm
TARGET_DIR=$MADPLAY_DIR/target-arm

tar -zxvf $TARBALL_DIR/zlib-1.2.3.tar.gz -C $SRC_DIR
tar -zxvf $TARBALL_DIR/libid3tag-0.15.1b.tar.gz -C $SRC_DIR
tar -zxvf $TARBALL_DIR/libmad-0.15.1b.tar.gz -C $SRC_DIR
tar -zxvf $TARBALL_DIR/madplay-0.15.2b.tar.gz -C $SRC_DIR

# for f in $(ls $TARBALL_DIR/*.tar.gz); do tar -zxvf $f -C $SRC_DIR; done

export CC=arm-linux-gcc

cd $SRC_DIR/zlib-1.2.3
./configure --prefix=$TARGET_DIR
make
make install

cd $SRC_DIR/libid3tag-0.15.1b
./configure --host=arm-linux --prefix=$TARGET_DIR --disable-debugging --disable-shared --enable-static CPPFLAGS=-I$TARGET_DIR/include LDFLAGS=-L$TARGET_DIR/lib
make
make install

cd $SRC_DIR/libmad-0.15.1b
./configure --host=arm-linux --prefix=$TARGET_DIR --disable-debugging --disable-shared --enable-static CPPFLAGS=-I$TARGET_DIR/include LDFLAGS=-L$TARGET_DIR/lib
make
make install

cd $SRC_DIR/madplay-0.15.2b
./configure --host=arm-linux --prefix=$TARGET_DIR --disable-debugging --disable-shared --enable-static CPPFLAGS=-I$TARGET_DIR/include LDFLAGS=-L$TARGET_DIR/lib
make
make install

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$TARGET_DIR/lib $TARGET_DIR/lib/libmad.a $TARGET_DIR/lib/libid3tag.a -lz -lm -static

mv madplay madplay-d
mv $TARGET_DIR/bin/madplay $TARGET_DIR/bin/madplay-d
cp -a madplay-s $TARGET_DIR/bin

 

PS:

在PC機和開發板上執行madplay程序的過程信息:
#madplay XXX.mp3
MPEG Audio Decoder 0.15.2 (beta) - Copyright (C) 2000-2004 Robert Leslie et al.
          Title: XXXXXX
         Artist: XXXXXX
           Year: XXXXXX
          Genre: XXXXXX

出現這些信息就成功了,音質還真不錯,再加個圖形界面和按鍵,就能做個MP3了!

Madplay還有一些參數:比如-r循環播放,還可以進行格式轉換:
madplay 111.mp3 –o 222.wav。

功能很強大。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章