1.首先介绍Qt的各个版本
(1)什么是QT:Qt是一个完整的C++应用程序开发框架。它包含一个类库,和用于跨平台开发及国际化的工具。Qt API在所有支持的平台上都是相同的,Qt工具在这些平台上的使用方式也一致,因而Qt应用的开发和部署与平台无关。
(2)什么是Qtopia:Qtopia是一个面向嵌入式Linux的全方位应用程序开发平台,同时也是用于基于Linux的PDA(个人数字助理),智能电话(Smartphone)以及其他移动设备的用户界面。简单地说,Qtopia实质上是一组关于PDA和智能电话的应用程序结合,如果需要开发这类产品可以在这组程序的基础上迅速构建出PDA或者智能电话。Qtopia实质上依赖Qt/Embedded。
(3)什么是Qt/Embedded:它是一个完整的自包含GUI和基于Linux的嵌入式平台开发工具。这个开发工具的名字好像最容易混淆,当然Qt/Embedded是最熟悉的名字,好像 Qtopia Core说的也是它。最近,奇趣公司又该名字了,它的新名字叫做qt-embedded-linux-xxxx,看来这个Qt/Embedded的马甲还很多哈。
2.qt-x11,qt-embedded-x86,qt-embedded-arm各版本的理解
qt-x11版本可以产生Qt开发工具,如designer等等,最重要的是可以得到qvfb,嵌入式的开发有了qvfb,就可以不需要实际的开发板,也可以开发Qt应程序。
qt-embedded版本就是专门用于嵌入式方面的版本,qt-embedded有两个复制:qt-embedded-linux-opensource-src-4.4-x86 和qt-embedded-linux-opensource-src-4.4-arm,根据他们的名字可以知道前者是适合x架构的,后者适 合arm架构。
为什么需要两个呢?如果有开发板的话,可以只编译qt-embedded版本成arm架构的就可以了,但是很多时候用qvfb的话,开发会方 便很多,所以多编译一个x86架构的也不错。
这里是否有些疑问,qt-x11也是适合x86结构的,这不是和qt-embedded重复了吗?答案是这样 的,qt-embedded版本只能在嵌入式板子上面运行,编译成x86架构的程序也只能在x86的嵌入式板子上跑。前面说过,我们需要qvfb来开发, 但是qvfb只能执行x86架构的应用程序,所以需要让qt-embedded生成关于x86的库和其他文件。
而将qt-embedded编译成arm, 又是为什么呢?道理很简单,我最终的qt应用程序需要在arm架构上面运行,当然需要这方面的库,所以编译成arm也就顺理成章了。
好了,现在简单的总结 一下,首先,使用qt-x11提供的库和开发工具开发出qt应用程序,然后使用qt-embedded关于x86库和工具再次编译我们开发qt应用程序, 这是所得到的可执行文件就可以在qvfb上运行了,最后,使用qt-embeddedd的arm库再次编译就可以得到在arm上能运行的可执行程序。很明 显,如果有开发板,第二步是可要可不要的(最好是要),如果没有开发板的话,第三步也就没必要了,这样就不需要将qt-embedded编译成适合arm 架构的。
3.ubuntu下各版本Qt环境的设置
我的开发环境:【操作系统】:Ubuntu 12,【交叉编译器】:armlinux-gcc
具体步骤与说明:
1. 下载源码包
qt-x11-opensource-src-4.5.tar.gz
qt-embedded-linux-opensource-src-4.5.tar.gz
2.编译及安装qt-x11-opensource-src-4.5.0
qt-x11版本可以产生Qt开发工具,如designer等等,最重要的是可以得到qvfb,嵌入式的开发有了qvfb,就可以不需要实际的开发板,也可以开发Qt应程序。
#tar zxvfqt-x11-opensource-src-4.5.0.tar.gz
#cdqt-x11-opensource-src-4.5.0
#./configure
#make
#make install
历经漫长的编译过程,约一个半小时,默认安装在/usr/local/Trolltech/Qt-4.5.0下.编译完成后源程序不要删除,还有用。
3.编译及安装qt-embedded-linux-opensource-src-4.5.0
在root目录下建立一个src目录,用于存放编译源文件qt-embedded-linux-opensource-src-4.5.0.tar.gz。将其解压得到qt-embedded-linux-opensource-src-4.5.0,重命名为qt-embedded-linux-opensource-src-4.5.0-x86。再次解压qt-embedded-linux-opensource-src-4.5.0.tar.gz,并重命令为qt-embedded-linux-opensource-src-4.5.0-arm.为什么有两个复制呢?我们可以从他们的名字上就不难看出前者是适合x架构的,后者适合arm架构的,如果有开发板的话,可以只编译qt-embedded版本成arm架构的就可以了,但是很多时候用qvfb的话,开发会方便很多,所以多编译一个x86架构的也不错。
#mkdir ~/src
#mvqt-embedded-linux-opensource-src-4.5.0.tar.bz2~/src
#tar zxvfqt-embedded-linux-opensource-src-4.5.0.tar.gz
#mvqt-embedded-linux-opensource-src-4.5.0 qt-embedded-linux-opensource-src-4.5.0-x86(重命名)
#tar zxvfqt-embedded-linux-opensource-src-4.5.0.tar.gz
#mv qt-embedded-linux-opensource-src-4.5.0qt-embedded-linux-opensource-src-4.5.0-arm(重命名)
#cdqt-embedded-linux-opensource-src-4.5.0-x86
#./configure-prefix /usr/local/Trolltech/QtEmbedded-4.5.0-x86-embedded x86 –qvfb (编译x86)
#make
#make install
好的,qt-embedded-x86被安装在/usr/local/Trolltech/QtEmbedded-4.5.0-x86下.
#cdqt-embedded-linux-opensource-src-4.5.0-arm
#./configure-prefix /usr/local/Trolltech/QtEmbedded-4.5.0-arm-embedded arm (编译arm)
#make
#make install
-------OK,qt-embedded-arm被安装在/usr/local/Trolltech/QtEmbedded-4.5.0-arm下.
至此我们已经安装好了qt-x11版(在PC机上运行的QT),qt-embedded-x86版(x86体系的嵌入式板子上运行的QT)和qt-embedded-arm(arm板子上运行的QT)。
4.设置各版本Qt的环境变量
(1)qt-x11:
vi setenv.sh
添加如下内容:
PATH=/usr/local/Trolltech/Qt-4.5.0/bin:$PATH
LD_LIBRARY_PATH=/usr/local/Trolltech/Qt-4.5.0/lib:$LD_LIBRARY_PATH
保存退出.移到/usr/local/Trolltech/Qt-4.5.0中。
cdqt-x11-opensource-src-4.5.0
cd /tools/qvfb
make --会在qt-x11-opensource-src-4.5.0/bin下生成qvfb,我们将它copy至/usr/local/Trolltech/QtEmbedded-4.5.0-x86/bin下
cp ../..bin/qvfb/usr/local/Trolltech/QtEmbedded-4.5.0-x86/bin
(2)qt-embedded-x86:
vi setenv.sh
添加如下内容:
QTEDIR=/usr/local/Trolltech/QtEmbedded-4.5.0-x86
PATH=/usr/local/Trolltech/QtEmbedded-4.5.0-x86/bin:$PATH
LD_LIBRARY_PATH=/usr/local/Trolltech/QtEmbedded-4.5.0-x86/lib:$LD_LIBRARY_PATH
保存退出.移到/usr/local/Trolltech/QtEmbedded-4.5.0-x86中。
(3)qt-embedded-arm:
vi setenv.sh
添加如下内容:
QTEDIR=/usr/local/Trolltech/QtEmbedded-4.5.0-arm
PATH=/usr/local/Trolltech/QtEmbedded-4.5.0-arm/bin:$PATH
LD_LIBRARY_PATH=/usr/local/Trolltech/QtEmbedded-4.5.0-arm/lib:$LD_LIBRARY_PATH
保存退出.移到/usr/local/Trolltech/QtEmbedded-4.5.0-arm中。
(4)我们在运行的时候分别运行对应的脚本即可,比如我们要用qt-x11:
cd/usr/local/Trolltech/Qt-4.5.0
source setenv.sh
然后就可以用qmake designer等工具了.
5.运行库移植到mini2440板
A. 准备工作
在PC 机上建立nfs 服务,共享root 目录,在mini 2440板mount。
B. 建立目录
在mini 2440板建立如下目录:
/usr/local/Trolltech/QtEmbedded-4.5.0-arm/bin
/usr/local/Trolltech/QtEmbedded-4.5.0-arm/lib/fonts
/tslib
C.复制字库文件
把PC 机上/usr/local/Trolltech/QtEmbedded-4.5.0-arm/lib/fonts目录上所有字库文件CP 到mini
2440上/usr/local/Trolltech/QtEmbedded-4.5.0-arm/lib/fonts上
D. 复制运行库
在PC 机上复制下列文件到mini 2440上/usr/local/Trolltech/QtEmbedded-4.5.0-arm/lib
libQtGui.so.4libts-0.0.so.0 libQtCore.so.4 libQtNetwork.so.4
一般在PC 机上/usr/local/Trolltech/QtEmbedded-4.5.0-arm/lib/和/tslib/上可以找到上述文件。复制
时注意如果需要复制的文件是链接文件,则把被链接文件都要复制上。
E.复制触摸屏软件
复制PC 机上/tslib/目录上全部文件(含子目录)到mini 2440上/tslib 目录
F. 在开发板上建立环境变量。
修改开发板上/etc/profile 文件,增加以下内容:
exportQTDIR=/usr/local/Trolltech/QtEmbedded-4.5.0-arm
exportT_ROOT=/tslib
exportPATH=$QTDIR/bin:$PATH
exportTSLIB_CONSOLEDEVICE=none
exportTSLIB_FBDEVICE=/dev/fb0
exportTSLIB_TSDEVICE=/dev/input/event0
exportTSLIB_PLUGINDIR=$T_ROOT/lib/ts
exportTSLIB_CONFFILE=$T_ROOT/etc/ts.conf
exportTSLIB_CALIBFILE=/etc/pointercal
exportQWS_MOUSE_PROTO=tslib:/dev/input/event0
exportLD_LIBRARY_PATH=$T_ROOT/lib:$QTDIR/lib
修改mini 2440上/tslib/etc/ts.conf文件:把第二行# module_raw input 前面的#和空格去除,保存退
出。
G. 校准触摸屏
从新启动开发板,执行:
cd /
cd tslib/bin
./ts_calibrate 校准触摸屏
./ts_test 测试触摸屏
如果正常,QT4 Embedded 移植成功!
6.QT4应用程序开发步骤如下:
1. 安装QT creator(linux)
下载QTcreator安装文件,记得是.bin格式的,如果下的是源码,还得重新编译,而前者可以直接安装。
安装完成之后,添加qmake,在工具-->选项-->QT4-->添加,选择我们上面移植的QT4.7库/opt/qt-4.7.4-arm/bin,选中qmake。
添加工具链,工具-->选项-->工具链-->添加,选择交叉编译工具,即arm-linux-gcc4.3.2。
这样载入工程后点击构建就可以交叉编译应用程序了。
3. 编写QT4应用程序
利用安装好的QT creator编写应用程序,并在x86平台上调试通过。
4. 交叉编译应用程序
将编写好的工程文件拷贝到Linux下,用第二步建立好的交叉编译平台,编译此程序。即产生了arm平台可执行文件。
其中设置可能需要修改,包括qmake、工具链、目标文件目录。
5. 移植到arm平台
将编译好的QT库文件(即第二步编译安装的,目录/opt/qt-4.7.4-arm)拷入文件系统中相同目录下,并将交叉编译好的应用程序拷入qt-4.7.4-arm目录下。
6. 编写开机运行脚本
在/bin目录下新建脚本
vimmyqt4application
内容如下:
#!/bin/sh
exporttslib_root=/usr/local/tslib
exporttslib_tsdevice=/dev/input/event1
exporttslib_tseventtype=h3600
exporttslib_conffile=/usr/local/tslib/etc/ts.conf
exporttslib_plugindir=/usr/local/tslib/lib/ts
#exporttslib_calibfile=/etc/pointercal
exporttslib_calibfile=/mnt/disk/pointercal
exporttslib_plugindir=$tslib_root/lib/ts
exporttslib_consoledevice=none
exporttslib_fbdevice=/dev/fb0
exportqtdir=/ opt/qt-4.7.4-arm
exportqt_qws_fontdir=/opt/qt-4.7.4-arm/lib/fonts
exportld_library_path=$qtdir/plugins/qtopialmigrate/:$qtdir/qt_plugins/imageformats/:$qtdir/lib:/root/tslib/build/lib:$ld_library_path
exportpath=/bin:/sbin:/usr/bin/:/usr/sbin:/root/tslib/build/bin
if [ -c/dev/input/event1 ]; then
exportqws_mouse_proto="tslib:${tslib_tsdevice}"
if [! -s /mnt/disk/pointercal ] ; then
rm /mnt/disk/pointercal
/usr/local/tslib/bin/ts_calibrate
fi
else
exportqws_mouse_proto="mouseman:/dev/input/mice"
> tslib_calibfile
fi
exportqws_keyboard=tty:/dev/tty1
fb_size=$(cat/sys/class/graphics/fb0/virtual_size)
#exportqws_display="linuxfb:mmwidth76:mmheight44:1"
case"$fb_size" in
800,480)
exportqws_display="linuxfb:mmwidth91:mmheight53:1"
;;
480,272)
exportqws_display="linuxfb:mmwidth76:mmheight44:1"
;;
*)
exportqws_display="linuxfb:mmwidth91:mmheight53:1"
;;
esac
#exportqws_display=:1
exporthome=/mnt/disk/qte4home
cd/opt/qt-4.7.4-arm
./myqt4application–qws
第3-21行设置有关tslib环境变量。
第23-29行设置有关qt4环境变量,这里增加了QT_QWS_FONTDIR环境变量的设置,不然可能导致以下错误:
QFontDatabase:Cannot find font directory /usr/local/Trolltech/QtEmbedded-4.5.1/lib/fonts
- is Qt installed correctly?
第31-49行判断用户是使用触摸屏还是鼠标设备,并使用不同的配置,这里需要说明的是:在OK6410配套文件中,这里设置得不对,会导致触摸屏没有反应! 其中-c表示文件存在且为字特殊文件时为真(/dev/input/event1为触摸屏设备,在linux3.0中为event2),-s表示文件存在且大小不为零时为真。
第83-85行切换到应用程序目录并运行。
7. 修改/etc/init.d/rcS
最后一行修改为:/bin/ myqt4application&