虽然网上有不少关于这方面的资料,想了想还是自己写个总结,毕竟各人有各人的问题,这篇文章也主要是作为个人的学习记录,需要的朋友可以参考哈,老手高手们就不用看了哈。。
之前已经搭建过友善之臂提供的qtopia-2.20开发环境,但用着用着愈发觉着不爽。为何??Qtopia-2.20是基于Qt-Embedded2.3的。2.3版本哪!!!现在Qt/Qte的最新版本是Qt4.8beta。虽然用qtopia2.2的朋友还不少,但是作为新手的小弟,入门学的是现在流行的4.x版本(实际上Qt4.x也发行很久了吧),在PC上编译测试无错的程序拿到qtopia中编译便错漏百出,原因很明显的就是因为版本问题。2.3版本果断无法支持4.x的。于是便有了下文。
好了。前言类的废话说的有点多了。现在进入正题。
1.材料准备
先从官网上下载Qt的源码包
http://qt.nokia.com/downloads-cn
注意,从4.6版本起,Qt的嵌入式版本还有PC版本已经集合为一个包了,所以你只需下载一个源码包即可。
图方便的话就下个Qt SDK,里面集成了Qt库(PC版),Qt Creator,省去了编译Qt PC版的麻烦。
还有友善之臂提供的qtopia文件系统包 root_qtopia.tar.gz 下载见这篇文章
http://www.linuxidc.com/Linux/2011-08/40398.htm
(官网上的好像更新为Rootfs_qtopia_Qt4,当然有Qt4版的就更好了)
我电脑上的源码包是 qt-everywhere-opensource-src-4.7.2.tar.gz,友善的qtopia文件系统包 root_qtopia.tar.gz,同时还有Qt SDK:qt-sdk-linux-x86-opensource-2010.05.1.bin,系统为Ubuntu 11.04。
2.搭建开发环境
这一部分分为三步,分别为编译Qt的PC版,嵌入式开发x86版,嵌入式开发arm版。简单解释下Qt的这三个版本。PC版用于开发PC桌面应用。x86版编译后的程序运行于PC端的qvfb模拟器,是为了模拟程序在目标平台上的运行情况。而arm版的Qt通过交叉编译得到在arm开发板上运行的程序。
编译PC版Qt
将源码包 qt-everywhere-opensource-src-4.7.2.tar.gz 复制到 /tmp目录下,解压,配置,编译,安装
tar zvf qt-everywhere-opensource-src-4.7.2.tar.gz
cd qt-everywhere-opensource-src-4.7.2
./configure -prefix (yourWay)
make
make install
编译过程相当漫长,图方便的话就安装Qt SDK吧,里面集成了Qt4.7.0库,Qt Creator和相关开发工具。
直接 ./qt-sdk-linux-x86-opensource-2010.05.1.bin 安装(我就是SDK安装的)
实际上如果不需要作桌面开发的话,这一步完全可以省去
编译x86版本Qte
在原目录下 make clean ,重新配置编译文件
make clean
./configure -prefix /opt/QtEmbedded-4.7.2/x86 -embedded x86 -qt-gfx-qvfb -qt-kbd-qvfb -qt-mouse-qvfb
make
make install
编译安装完成后还需要编译qvfb,进入PC版安装目录,我的是SDK安装,目录是qtsdk-2010.05
cd qtsdk-2010.05/qt/tools/qvfb
http://www.cnblogs.com/bin/qmake qvfb.pro
此时错误出现了
WARNING: /opt/qtsdk-2010.05/qt/tools/qvfb/qvfb.pro:38: Unable to find file for inclusion /tools/shared/deviceskin/deviceskin.pri
查找deviceskin.pri:
locate deviceskin.pri
输出:(找不到的话 updatedb 更新下数据库)
/opt/qtsdk-2010.05/qt/tools/shared/deviceskin/deviceskin.pri
很明显应该是qvfb.pro出错,于是vi之,定位到38行:
include($$QT_SOURCE_TREE/tools/shared/deviceskin/deviceskin.pri)
查看文件发现其中并没有对QT_SOURCE_TREE的定义,而后面还有两处引用到QT_SROUCE_TREE,于是在前面添加该变量的定义
QT_SOURCE_TREE=/opt/qtsdk-2010.05/qt
再次qmake便没有错误了。编译的时候我的机子上面是报错了,视各人环境而异,我就把错误简单列出来并给出我的解决方法:
缺少XTest.h ---> 安装libXtst-dev
缺少XInput.h ---> 安装libxi-dev
缺少libGLU.so ---> /usr/lib下只有libGLU.so.1,所以增加软链接:ln -s libGLU.so.1 libGLU.so
缺少libGL.so ---> 在/usr/lib下建立到/usr/lib/mesa的软链接 ln -s /usr/lib/mesa/libGL.so.1 /usr/lib/libGL.so
编译完成后把qvfb的可执行文件复制到/opt/QtEmbedded-4.7.2/x86/bin中
编译arm版本Qte
#请确认是否安装 arm-linux-gcc,可以到友善的官网下,我用的是他提供的4.3.2版本。
编译前还需安装tslib以支持触摸屏,下载地址:
http://www.linuxidc.com/Linux/2011-08/40398.htm
这个包是可用的,不过配置完configure后还需要小改Makefile
找到/usr/local/arm/4.4.3/bin/,由于我机子之上装的是4.3.2,路径为/usr/local/arm/4.3.2,所以把这段改为/usr/local/arm/4.3.2/bin。
编译 --> 安装:make --> make install
进入 qt-everywhere-opensource-src 目录,make clean,新建myconfig文件,编辑如下:
#!/bin/sh
./configure
-prefix /opt/QtEmbedded-4.7.2/arm
-opensource
-confirm-license
-release -shared
-embedded arm
-xplatform qws/linux-arm-g++
-depths 16,18,24
-fast
-optimized-qmake
-pch
-qt-sql-sqlite
-qt-libjpeg
-qt-zlib
-qt-libpng
-qt-freetype
-little-endian -host-little-endian
-no-qt3support
-no-libtiff -no-libmng
-no-opengl
-no-mmx -no-sse -no-sse2
-no-3dnow
-no-openssl
-no-webkit
-no-qvfb
-no-phonon
-no-nis
-no-opengl
-no-cups
-no-glib
-no-xcursor -no-xfixes -no-xrandr -no-xrender
-no-separate-debug-info
-nomake examples -nomake tools -nomake docs
-D__ARM_ARCH_5TEJ__
-qt-mouse-tslib -I/usr/local/tslib/include -L/usr/local/tslib/lib
最后一个给出的是tslib安装的路径。
上面这段编译参数也是我从网上找的,可以通过 ./configure --help 查看相关信息
编译前最好检查一下下列几个包是否安装,否则编译时会出错:
libpng-dev, libjpeg-dev, libzlib-dev
接下来就是编译安装的阶段了:
make
make install
至此,Qt/Qte的开发环境搭建就算完成了。
3.移植
我是用nfs作为根文件系统来启动开发板的。默认下Ubuntu是不装nfs服务的,所以必须在主机上安装nfs。
apt-get install nfs-kernel-server
安装nfs-kernel-server会同时安装nfs-common和portmap,nfs-common是nfs客户端服务,portmap提供端口映射服务,RPC(远程调用,nfs是基于RPC的)使用时portmap必须运行。
简单讲下nfs服务的配置
首先配置protmap
vi /etc/default/portmap, 如果有 “-i 127.0.0.1”字符串就将其去掉。
vi /etc/hosts.deny (拒绝访问的IP地址,这里对所有的都禁用)
portmap:ALL
lockd:ALL
mountd:ALL
rquotad:ALL
statd:ALL
vi /etc/hosts.allow (允许访问的IP地址,添加你所允许的进去)
portmap:192.168.1.
lockd:192.168.1.
mountd:192.168.1.
rquotad:192.168.1.
statd:192.168.1.
保存后重启portmap服务以使配置生效:
/etc/init.d/portmap restart
接着配置nfs服务
vi /etc/exports
/opt/FriendlyARM/Micro2440/root_qtopia *(rw,sync,no_root_squash)
/opt/FriendlyARM/Micro2440/root_qtopia 是共享的目录,*表示对所有的IP开放,rw表示有读写权限,sync表示同步读写,no_root_squash表示登录用户有root权限
(说明一下在我的PC上portmap中的hosts.allow要设为*,exports也要设为*才能够正常启动,这个问题我一直没搞懂,恳请大家指点!)
重新加载以使配置生效
service nfs-kernel-server reload
如果nfs服务还未启动则:
exportfs -r
service nfs-kernel-server start
程序移植
接着把前面准备的root_qtopia压缩包挪到/opt/Friendly/Micro2440,解压得到root_qtopia目录,把Qte相关库文件和tslib库文件copy到root_qtopia目录下:
cd /opt/FriendlyARM/Micro2440/root_qtopia
mkdir ./usr/local/Qte-4.7.2
cp -r /opt/QtEmbedde-4.7.2/arm/lib ./usr/local/Qte-4.7.2
cp -r /usr/local/tslib ./usr/local/
这样子就把arm板平台环境搭好了。
用交叉网线连接PC机和开发版。注意一定是要交叉网线。有路由器的话可以分别连到路由器上,这样PC也可以上网。
然后设置PC机和开发板的IP地址,我这里PC机设为:192.168.1.100;开发板设为:192.168.1.200 。
开发板设为NAND - FLASH启动。连接串口终端。
上电,并“快速”的按下开发板上 K1 ~ K6任意一按键,进入supervivi模式。
##### FriendlyARM BIOS 2.0 for 2440 #####
[x] format NAND FLASH for Linux
[v] Download vivi
[k] Download linux kernel
[y] Download root_yaffs image
[a] Absolute User Application
[n] Download Nboot for WinCE
[l] Download WinCE boot-logo
[w] Download WinCE NK.bin
[d] Download & Run
[z] Download zImage into RAM
[g] Boot linux from RAM
[f] Format the nand flash
[b] Boot the system
[s] Set the boot parameters
[u] Backup NAND Flash to HOST through USB(upload)
[r] Restore NAND Flash from HOST through USB
[q] Goto shell of vivi
[i] Version: 0945-2K
Enter your selection: q
Supervivi> param set linux_cmd_line "console=ttySAC0 root=/dev/nfs nfsroot=192.168.1.100:/opt/FriendlyARM/Micro2440/root_qtopia
ip=192.168.1.200:192.168.1.100:192.168.1.255:255.255.255.0:hust-cassvin:eth0:off"
Supervivi> boot
如果开发板能启动qtopia图形界面,那么恭喜你,nfs文件系统挂载成功。接下来就可以做程序移植了。
修改/opt/FriendlyARM/Micro/root_qtopia/bin/qtopia以添加环境变量
将原来的:
export TSLIB_TSDEVICE=/dev/input/event0
export TSLIB_CONFFILE=/usr/local/etc/ts.conf
export TSLIB_PLUGINDIR=/usr/local/lib/ts
export TSLIB_CALIBFILE=/etc/pointercal
export QTDIR=/opt/Qtopia
export QPEDIR=/opt/Qtopia
export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib:/usr/local/lib:$LD_LIBRARY_PATH