二 移植和编译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