二 移植和編譯mscore-0.9.3
要成功編譯,必須下載編譯alsa-lib,因爲該工程中調用alsa-lib的頭文件,從官方網站上下載。解壓後不要編譯,否則會安裝在主機上,我們最終是要運行在嵌入式linux上的,這裏把源碼中的頭文件包含到mscore的編譯路徑中,然後交叉編譯alsa-lib,得到libasound.so庫文件,放到arm-linux-gcc的安裝目錄的lib中,交叉編譯alsa-lib的腳本:
CC=arm-linux-gcc
./configure -prefix="/usr/local/arm/3.4.1/arm-linux" --host=arm-linux --target=arm-linux –build=i386-linux
注意:不能有 --with-softfloat,不支持浮點運算,否則編譯出錯。
關於make的幾個選項的理解:
LDSHARED= CC_FOR_BUILD="arm-linux-gcc" CC="arm-linux-gcc" LD="arm-linux-ld" CPP="arm-linux-g++ -E" AR="arm-linux-ar rc" prefix="/usr/local/arm/3.4.1" CFLAGS="-fPIC"
其中,LD選項表示最後連接的時候,採用哪個版本的連接器。交叉編譯中如果只指定了arm-linux-gcc,那麼最後仍然使用主機ld,就會出現.o文件格式無法識別的問題。
然後編譯mscore-0.9.3,因爲該項目用到了cmake,必須在CMakeLists.txt中定義:
# Added by leo to cross compile.
set(CMAKE_C_COMPILER "/usr/local/arm/3.4.1/bin/arm-linux-gcc")
set(CMAKE_CXX_COMPILER "/usr/local/arm/3.4.1/bin/arm-linux-g++")
project(mscore)
注意:這兩行定義讓cmake生成的Makefile中使用arm-linux-gcc進行編譯,否則還是會使用主機的gcc.同時,前兩行設定必須在project(mscore)之前,否則設置不能生效。
參考mscore中README,在目錄下make,編譯期間可能出現錯誤,在相應的出錯代碼處進行修改,或者直接註釋掉。最後,在連接時,出現錯誤 -lasound無法找到,這是連接器ld沒有知道libasound.so庫文件的錯誤,最終解決方法是,編譯完成後,手工執行連接操作,把arm-linux-ld -lasound中的-lasound或者先前編譯出來的libasound的絕對路徑即可。這樣就生成了可執行文件mscore.
前面給出了在開發板上運行qtopia的啓動腳本,運行普通的qte程序也類似,不過包含的不是qtopia的庫,應該是前面編譯好的qte4.4.3_arm目錄下的庫,把這個目錄掛載或者複製到開發板系統目錄中,這個目錄不一定要和主機目錄一樣。啓動腳本如下:
#!/bin/sh
# created by leo feb, 10th, 2009
export set HOME=/root
export set QTEDIR=/opt/qt/qte4.4.3_arm
export set QWS_KEYBOARD="USB:/dev/input/event1"
export set QWS_MOUSE_PROTO="Tslib:/dev/h3600_tsraw"
export set QWS_SIZE=800x480
export set LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$QTEDIR/lib:/usr/local/arm/3.4.1/arm-linux/lib
#export set QWS_DISPLAY="linuxFB:mmWidth35:mmHeight45:0"
export set QWS_DISPLAY="linuxFB:mmWidth90:mmHeight110:0"
ln -s /dev/fb0 /dev/fb/0
export set TSLIB_ROOT=/opt/tslib1.4-install
export set TSLIB_TSEVENTTYPE=H3600
export set TSLIB_FBDEVICE=/dev/fb0
export set TSLIB_TSDEVICE=/dev/h3600_tsraw
export set TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf
export set TSLIB_CONSOLEDEVICE=none
export set TSLIB_CALIBFILE=/etc/pointercal
export set TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts/
export set LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$TSLIB_ROOT/lib
if [ -f "/etc/pointercal" ]; then
export set POINTERCAL_FILE=/etc/pointercal
$QTEDIR/bin/mscore -qws
else
$TSLIB_ROOT/bin/ts_calibrate
$QTEDIR/bin/mscore -qws
fi
這樣,mscore終於在開發板上運行起來了,樂譜符號和字體顯示正常,如意料的一樣,不可能有聲音,報錯信息:
QPainter::begin: Paint device returned engine == 0, type: 2
QPainter::end: Painter not active, aborted
ALSA lib conf.c:3009:(snd_config_update_r) Cannot access file /usr/local/arm/3.4.1/arm-linux/share/alsa/alsa.conf
ALSA lib pcm.c:2202:(snd_pcm_open_noupdate) Unknown PCM default
Alsa_driver: Cannot open PCM device default for playback.
init ALSA audio driver failed
init ALSA driver failed
no audio driver
sequencer init failed