3.4 移植Qt-Extended 4.4.3 (Qtopia4.4.3) 到mini6410
本章节将讲解如何编译和移植Qt-Extended4.4.3,包括如何编译PC版本以及arm版本,并最终将它部署到mini6410上运行。
本章节中会用到如下软件包,请先在光盘A上找到以下软件包和工具:
第 - 24 - 页
文件名
光盘路径
说明
qt-extended-opensource-src-4.4.3.tar.gz
开发文档和教程\01 Qt4和Qtopia编程开发指南\源代码\第三章\3-4
Qt-Extended4.4.3源代码
3.4.1 获得并安装Qt-Extended4.4.3源代码
在FriendlyARM mini6410光盘A的以下路径“开发文档和教程\01 Qt4和Qtopia编程开发指南\源代码\第三章\3-4”可以拿到Qt-Extended4.4.3源代码的压缩包qt-extended-opensource-src-4.4.3.tar.gz,将其拷贝到 /opt 下备用。
我们将创建/opt/mini6410/qt-extended4.4.3目录, 用作Qt-Extended4.4.3的工作目录,在接下的PC版本及ARM版本的编译工作中,都将在这个目录上进行, 在linux终端上输入如下命令(不用键入#),在/opt/mini6410/qt-extended4.4.3下解压Qt-Extended4.4.3的源码包:

# mkdir -p /opt/mini6410/qt-extended4.4.3 

 # cd /opt/mini6410/qt-extended4.4.3 

 # tar xvzf /opt/qt-extended-opensource-src-4.4.3.tar.gz 

 3.4.2 编译和运行x86版本的Qt-Extended-4.4.3 

 3.4.2.1 配置并编译x86版本 

 我们需要创建一个build目录专门存放编译x86版本时产出的临时文件,以及最终编译生成的image也会存放于这个目录,用下列命令创建目录: 

 # mkdir -p /opt/mini6410/qt-extended4.4.3/buildx86 

 输入以下命令,执行编译前的配置: 

 # export LC_CTYPE="en_US" 

 # export LANG="en_US" 

 # export LANGUAGE="en_US" 

 第 - 25 - 页 

 # cd /opt/mini6410/qt-extended4.4.3/buildx86 

 # echo yes | ../qt-extended-4.4.3/configure \ 

 -ui-type mobile \ 

 -release \ 

 -clean \ 

 -sound-system alsa \ 

 -build-qt \ 

 -no-sxe \ 

 -no-ssl \ 

 -no-v4l2 \ 

 -no-vpn \ 

 -no-phonon \ 

 -no-libamr \ 

 -dynamic-rotation \ 

 -mediaengines cruxus \ 

 -remove-mediaengine gstreamer,helix \ 

 -pictureflow \ 

 -remove-module bluetooth,drm \ 

 -no-dbus \ 

 -no-dbusipc \ 

 -add-displaysize 240x320 \ 

 -extra-qt-embedded-config "-qt-freetype -no-webkit -no-dbus -qt-gfx-transformed -qt-gfx-linuxfb" \ 

 -extra-qt-config "-no-webkit" \

2>&1 | tee ../qtopiaconfig.log
在上面的配置命令后,我们首先将语言设置为en_US, 原因是由于Fedora9终端默认的语言编码为zh_CN.UTF-8或者en_US.UTF-8,而perl在UFT8下会有问题,Qt-Extended4.4.3的编译脚本使用了perl,所以先将语言改成en_US,否则会出现很多莫名其妙的编译错误,脚本参数中的其它编译配置参数请输入“../qt-extended-4.4.3/configure –help”了解其含义。
接下来输入以下命令进行编译和安装:
# bin/qbuild 2>&1 | tee ../qtopiamake.log
# bin/qbuild image
(注:命令后跟的2>&1 | tee ../XXX.log 不是必须的,这一串命令参数的含义时,将编译过程中的所有
第 - 26 - 页
的输出信息同时输出到屏幕和log 文件中)
3.4.2.2 运行PC版本的Qt-Extended4.4.3
Qt-Extended4.4.3自带了用于运行的脚本runqtopia,因为只要执行以下命令即可运行Qt-Extended4.4.3:
# cd /opt/mini6410/qt-extended4.4.3/buildx86
# bin/runqtopia
Qt-Extended4.4.3的运行结果如下所示:
3.4.3 编译和运行arm版本的Qt-Extended-4.4.3
3.4.3.1 配置并编译arm版本
我们需要创建一个buildarm目录专门存放编译arm版本时产出的临时文件(.o, .moc,Makefile等等),最终编译生成的image也会存放于这个目录,用下列命令创建目录:
# mkdir -p /opt/mini6410/qt-extended4.4.3/buildarm
输入以下命令,执行编译前的配置:
第 - 27 - 页

# export LC_CTYPE="en_US" 

 # export LANG="en_US" 

 # export LANGUAGE="en_US" 

 # cd /opt/mini6410/qt-extended4.4.3/buildarm 

 # echo yes | ../qt-extended-4.4.3/configure \ 

 -ui-type mobile \ 

 -xplatform linux-arm-g++ \ 

 -arch arm \ 

 -release \ 

 -clean \ 

 -prefix /opt/Qtopia4.4.3 \ 

 -sound-system oss \ 

 -build-qt \ 

 -no-sxe \ 

 -no-ssl \ 

 -no-v4l2 \ 

 -no-vpn \ 

 -no-phonon \ 

 -no-libamr \ 

 -dynamic-rotation \ 

 -mediaengines cruxus \ 

 -remove-mediaengine gstreamer,helix \ 

 -pictureflow \ 

 -remove-module bluetooth,drm \ 

 -no-dbus \ 

 -no-dbusipc \ 

 -add-displaysize 240x320 \ 

 -extra-qt-embedded-config "-embedded arm -xplatform qws/linux-arm-g++ -no-cups -nomake examples -nomake demos -qt-libjpeg -qt-libmng -qt-libpng -no-dbus -depths 16,32 -qt-gfx-linuxfb -qt-gfx-transformed -no-gfx-qvfb -no-gfx-vnc -no-gfx-multiscreen -qt-kbd-tty -no-kbd-usb -no-kbd-sl5000 -no-kbd-yopy -no-kbd-vr41xx -no-kbd-qvfb -qt-mouse-tslib -no-webkit -no-openssl -no-phonon -no-phonon-backend -no-nas-sound -no-exceptions -svg" \ 

 -extra-qt-config "-no-webkit" \ 

 2>&1 | tee ../qtopiaconfig.log


在上面的配置命令后,我们首先将语言设置为en_US, 原因是由于Fedora9终端默认的语言编码为zh_CN.UTF-8或者en_US.UTF-8,而perl在UFT8下会有问题,Qt-Extended4.4.3的编译脚本使用了perl,所以先将语言改成en_US,否则会编译错误。
其它编译配置参数请输入“../qt-extended-4.4.3/configure –help”了解其含义。
第 - 28 - 页
由于我们所用的编译器较新,有一些代码语法可能已经不兼容了,所以在编译之前需要先修改一个源文件,否则如果直接编译,会出现以下编译错误:

/opt/mini6410/qt-extended4.4.3/qt-extended-4.4.3/src/libraries/qtopia/qphoneprofile.cpp:1026:1: error: 'QPhoneProfile::Schedule::Schedule' names the constructor, not the type 

 为了修正上述的编译错误,请用vi打开qphoneprofile.cpp,定位到1026行,将其中的 

 QPhoneProfile::Schedule::Schedule &QPhoneProfile::Schedule::operator=(const Schedule &other) 

 改成 

 QPhoneProfile:: Schedule &QPhoneProfile::Schedule::operator=(const Schedule &other) 

 接着进行编译和安装: 

 # bin/qbuild 2>&1 | tee ../qtopiamake.log 

 # bin/qbuild image


出现 Qt Extended has been installed.表示已经成功编译,编译生成的image将放在/opt/mini6410/qt-extended4.4.3/buildarm/image目录下。
3.4.3.2 在开发板上部置Qt-Extended-4.4.3
先确认你的mini6410烧写了最新版本的linux images,然后执行以下命令,将刚刚我们编译产出的 image 打包:
# cd /opt/mini6410/qt-extended4.4.3/buildarm/
# tar cvzf image.tgz image
将image拷贝到你的sd卡上,然后打开minicom, 开启mini6410开发板,在minicom输入以下命令,将image解压到/opt目录下,并将目录名改名为 Qtopia4.4.3,由于FriendlyARM已经提供了Qtopia4.4.3,所以我们首先将它删除,然后替换成我们自已编译的:
@# rm /opt/Qtopia4.4.3 -rf
@# cd /opt
@# tar xvzf /sdcard/image.tgz
@# mv /opt/image /opt/Qtopia4.4.3
第 - 29 - 页
3.4.3.3 在开发板上运行Qt-Extended-4.4.3
在运行任何Qt-Extended4.4.3程序之前,需要先退出Qtopia2.2.0 或者Qt4程序等一切Qt程序,退出Qtopia2.2.0的方法是:在Qtopia2.2.0中点“设置”中的“关机”可出现如下界面,点“Terminate Server”即可关闭Qtopia-2.2.0系统。
也可以使用其他的方法,比如在启动脚本/etc/init.d/rcS中注释掉qtopia启动项,再重新系统系统;或者使用killall命令杀死相关的进程(比较多;甚至是直接删除/opt目录中的所有内容重启。
为了更方便地运行Qtopia, 我们先创建一个脚本run_my_qtopia4,用于运行我们自已编译的Qtopia4:
@# vi /bin/run_my_qtopia4
在run_my_qtopia4中输入如下内容:
第 - 30 - 页

#!/bin/sh 

 if [ -e /etc/friendlyarm-ts-input.conf ] ; then 

 . /etc/friendlyarm-ts-input.conf 

 fi 

 true ${TSLIB_TSDEVICE:=/dev/touchscreen} 

 TSLIB_CONFFILE=/etc/ts.conf 

 export TSLIB_TSDEVICE 

 export TSLIB_CONFFILE 

 export TSLIB_PLUGINDIR=/usr/lib/ts 

 export TSLIB_CALIBFILE=/etc/pointercal 

 export QTDIR=/opt/Qtopia4.4.3 

 export QPEDIR=/opt/Qtopia4.4.3 

 export PATH=$QTDIR/bin:$PATH 

 export LD_LIBRARY_PATH=$QTDIR/lib:/usr/local/lib:$LD_LIBRARY_PATH 

 if [ -c /dev/touchscreen ]; then 

 export QWS_MOUSE_PROTO="Tslib:${TSLIB_TSDEVICE}" 

 if [ -e /etc/pointercal -a ! -s /etc/pointercal ] ; then 

 rm /etc/pointercal 

 fi 

 else 

 export QWS_MOUSE_PROTO="USB:/dev/input/mice" 

 >/etc/pointercal 

 fi 

 export QWS_KEYBOARD="TTY:/dev/tty1" 

 #export QWS_DISPLAY="Transformed:mmWidth66:mmHeight114:Rot90:0" 

 FB_SIZE=$(cat /sys/class/graphics/fb0/virtual_size) 

 case "$FB_SIZE" in 

 800,480) 

 第 - 31 - 页 

 export QWS_DISPLAY="LinuxFb:mmWidth91:mmHeight53:1" 

 ;; 

 480,272) 

 export QWS_DISPLAY="LinuxFb:mmWidth76:mmHeight44:1" 

 ;; 

 *) 

 export QWS_DISPLAY="LinuxFb:mmWidth91:mmHeight53:1" 

 ;; 

 esac 

 export LANG="en_US" 

 export HOME=/root/Qtopia4Home 

 if [ ! -e $HOME ]; then mkdir -p $HOME; fi 

 if [ ! -e /usr/share ]; then mkdir /usr/share; fi 

 if [ ! -e /usr/share/zoneinfo ]; then ln -s /opt/Qtopia/etc/zoneinfo /usr/share/; fi 

 if [ ! -e $HOME/Settings/Trolltech/qpe.conf ]; then 

 mkdir -p $HOME/Settings/Trolltech/ 

 cp $QPEDIR/etc/default/Trolltech/qpe.conf $HOME/Settings/Trolltech/qpe.conf -f 

 fi 

 export QTOPIA_PHONE_DUMMY=1 

 exec $QPEDIR/bin/qpe 

 run_my_qtopia4运行脚本说明如下: 

 a) 首先,我们需要根据我们使用的触摸屏,配置tslib的参数。 

 b) 然后,配置Qtopia的环境变量 QTDIR, QPEDIR 指向Qtopia Image的路径,配置QWS_MOUSE_PROTO指向触摸屏设备, QWS_KEYBOARD指向开发板上用于Hard Key的tty设备。 

 c) 配置QWS_DISPLAY环境变量设置LCD显示参数,根据屏幕分辨率的不同,设置不同的DPI,使文字大小的显示适中。 

 d) 由于mini6410没有GSM Modem, 所以设置QTOPIA_PHONE_DUMMY=1表示使用虚拟的modem设备。 

 e) 最后,执行 qpe 可执行文件,启动Qtopia。 

 第 - 32 - 页 

 为run_my_qtopia4设置可执行权限,然后修改 /etc/init.d/rcS文件,让系统启动时,自动启动我们自已编译的Qtopia: 

 @# chmod +x /bin/run_my_qtopia4 

 @# vi /etc/init.d/rcS 

 把文件中的: 

 /bin/qtopia & 

 改成: 

 /bin/run_my_qtopia4 &

然后重启开发板,应该可以看到我们自已build的Qt-Extended4.4.3了,运行效果如下所示:

"D:\ARM11\Tiny6410-A\开发文档和教程\01 Qt4和Qtopia编程开发指南\Mini6410 Qt4和Qtopia编程开发指南-20110112.pdf"P14~P32