[Linux][Madplay播放器移植mini2440(ARM9)]

Madplay移植到mini2440全過程詳解php

madplay交叉編譯html

交叉編譯器:arm-linux-gcc 3.4.1
PC環境:RedHat-6
linux

注意:最好在root權限下執行如下移植,不然在make install時可能權限不夠。工具

 

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

 

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

 

2、創建工做目錄,拷貝源代碼包.net

 

在/opt/madplay目錄下創建madplay目錄,並以此爲工做目錄,並在該目錄中創建如下子目錄,以存放不一樣的文件:
# cd /opt
# mkdir madplay
# cd madplay
# mkdir tarball src-x86 src-arm target-x86 target-arm
debug

 

目錄說明:
tarball目錄用來存放全部的源代碼包
src-x86目錄用來存放X86版本的全部源代碼文件
src-arm目錄用來存放ARM版本的全部源代碼文件
target-x86目錄是X86版本的安裝目錄
target-arm目錄是ARM版本的安裝目錄
接下來把從網上下載到的源代碼包放入tarball目錄。unix

 

3、PC-Linux(PC版本)

 

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

 

二、編譯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
madplay: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.8, dynamically linked (uses shared libs), not stripped

 

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

 

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

 

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

 

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

 

四、構建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

 

 

 

 

4、ARM-Linux(ARM版本)

 

一、解壓源代碼包
# 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

 

二、編譯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
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字節),可是運行時須要某些動態庫。

 

三、下載madplay到開發板運行測試
爲了區別於板子中已經存在的madplay,咱們把新作的更名爲mymadplay,把它以及依賴庫經過FTP或者NFS方式下載到開發板,並做以下放置:
執行文件mymadplay放在/usr/bin/目錄,庫文件:libm.so.6和libc.so.6放在/usr/lib目錄,固然若是是靜態連接的可執行程序就不用拷貝庫文件了。
拷貝一首mp3文件到開發板上,而後執行mymadplay進行測試。

 

四、構建並修正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。

 

功能很強大。

 

我用QT和madplay作了一個MP3播放器。稍後放出源代碼。

轉載:http://blog.chinaunix.net/uid-20539088-id-115750.html

相關文章
相關標籤/搜索