前言:
因为我的板子是飞凌的2440开发板。网上关于qt4移植到飞凌2440的文章并不是很多,其中移植这部分我也走了很多弯路,遇到很多问题,但最后还是搞出来了,其实这过去也有快一个月了,那个时候也没时间写文章,但为了跟大家一同学习,今天特花了点时间把前面的经验写下来,希望能帮到各位,好了下面就开始我们的移植之旅吧!
一、系统环境
宿主机:window xp sp3
虚拟机linux centOS
linux编译器(交叉编译器):arm-linux-gcc 3.4.1
开发板:飞凌2440--LCD 3.5寸
系统linux-2.6.24
文件系统为yaffs系统
所需软件包:
arm-linux-gcc-3.4.1.tar.bz2 下载地址:http://www.handhelds.org/download/projects/toolchain/arm-linux-gcc-3.4.1.tar.bz2
qt-embedded-linux-opensource-src-4.5.3.tar.gz 下载地址大家到网上搜一下就出来了。
tslib-1.4.tar.gz(用于触摸验证)
说明:说明一下这里为什么选择这些软件,首先fl2440板子需要编译器可以是2.95.3也可以使3.4.1这里我只是试了这两个,可能其他的也可以。而qt/embeded则是我随便下了一个。
补充:这里为了说的完整些,我把qt的各版本也给大家说一下,
关于Qt,Qt/E,Qtopia Core, Qtopia。
Qt泛指Qt的所有桌面版本,比如Qt/X11,Qt Windows,Qt Mac等。由于Qt最早是在Linux中随着KDE流行开来的,因此通常很多人说的Qt都指用于Linux/Unix的Qt/X11。
Qte(Qt/Embedded)是用于嵌入式Linux系统的Qt版本。Qt/E去掉了X Lib的依赖而直接工作于Frame Buffer上,因而效率更高,但它并不是Qt的子集,而应该是超集,部分机制(如QCOP等)不能用于Qt/X11中。
Qtopia是一个构建于Qte之上的类似桌面系统的应用环境,一般应用于PDA和手机。相比之下,Qte只是基础类库。
Qtopia Core:就是原来的Qte,大概从Qt 4开始改名,把Qtopia Core并到Qtopia的产品线中去了。但实际上Qtopia Core就相当于原来的Qte,仍然作为基础类库。
另外,似乎奇趣最近又把Qtopia Core改名叫做Qt for Embedded Linux了,不知道是不是因为Qtopia Core搞得大家都很糊涂,没人来买的缘故。
二、交叉编译器安装
a 解压 arm-linux-gcc-3.4.1.tar.bz2
#tar -jxvf arm-linux-gcc-3.4.1.tar.bz2
解压过程需要一段时间,解压后的文件形成了 usr/local/ 文件夹,进入该文件夹,将arm文件夹拷贝到/usr/local/下
# cd usr/local/
#cp -rv arm /usr/local/
现在交叉编译程序集都在/usr/local/arm/3.4.1/bin下面了
b. 修改环境变量,把交叉编译器的路径加入到PATH。(有三种方法,这里只写一种)
# vi ~/.bashrc
在最后加上:
export PATH=$PATH:/usr/local/arm/3.4.1/bin
c. 立即使新的环境变量生效,不用重启电脑
#source ~/.bashrc
d.检查是否将路径加入到PATH:
# echo $PATH
显示的内容中有/usr/local/arm/bin,说明已经将交叉编译器的路径加入PATH。至此,交叉编译环境安装完成。
f.测试是否安装成功
# arm-linux-gcc -v
上面的命令会显示arm-linux-gcc信息和版本,这是我显示的信息:
Reading specs from /usr/local/arm/3.4.1/lib/gcc/arm-linux/3.4.1/specs
Configured with: /work/crosstool-0.27/build/arm-linux/gcc-3.4.1-glibc-2.3.2/gcc- 3.4.1/configure --target=arm-linux --host=i686-host_pc-linux-gnu
--prefix=/usr/local/arm/3.4.1 --with-headers=/usr/local/arm/3.4.1/arm
-linux/include --with-local-prefix=/usr/local/arm/3.4.1/arm-linux --disable
-nls --enable-threads=posix --enable-symvers=gnu --enable-__cxa_atexit --enable- languages=c,c++ --enable-shared --enable-c99 --enable-long-long
Thread model: posix
gcc version 3.4.1
到这里就成功安装好了交叉编译环境
三、安装qt-embedded
注意这里我只是安装嵌入式版本的qt而没有安装qt-x11版本的,这里还是有区别的,首先不同的平台所需要的库是不一样的,也即使说,你用arm-linux-gcc的编译器来编译x-11的qt是不行的,相同地,用gcc编译嵌入式版本的qt也是不行的,那么就有arm-linux-gcc来编译嵌入式版本的qt就会编译出嵌入式版本的qt库,所以我们这里为、为什么来安装qt-embedded就是为了编译出嵌入式版本的库函数,然后将编好的程序在这样的环境下编译最后生成嵌入式的可执行文件,我觉得这就是我们的思路吧!所以呢,假如你想在宿主机上看一下你的程序对不对的话,那么你也可以来编译x-11的道理是一样的。好了,下面我们还是赶紧说吧。
哦,不好意思,在之前还需要安装一个东西,就是
tslib-1.4.tar.gz这是一个触摸屏校准的程序。
例如可用于它来校正触摸屏,并保存校正数据。所以第三步先暂停一下了...
四、安装tslib-1.4
把tslib-1.4 COPY到linux的 /tmp下,在cent的终端下执行:
#cd /tmp
# tar zxvf tslib-1.4.tar.gz ――――――――(最后在/tmp下解压生成tslib)
#cd tslib
#./autogen.sh
#./configure --prefix=/home/mytslib/ --host=arm-linux ac_cv_func_malloc_0_nonnull=yes
#make
#make install
成功后可在/home下生成mytslib,进入mytslib可以看到有bin include lib etc四个文件夹。我们暂时先不理它,在接下来的移植过程中才用到这些文件夹。
tslib就是这么简单。好了第三步继续。。。。
三、续
#cd /
#mkdir fl2440
#mkdir tslib
接下来我们把qt-embedded-linux-opensource-src-4.5.3.tar.gz COPY到/tmp下, 终端执行:
#cd /tmp
#tar zxvf qt-embedded-linux-opensource-src-4.5.3.tar.gz
#cd qt-embedded-linux-opensource-src-4.5.3
./configure -prefix /urs/local/QtEmbedded-4.5.3-arm -plugin-sql-sqlite -qt-sql-sqlite -phonon-backend -no-opengl -xplatform qws/linux-arm-g++ -embedded arm -no-qvfb -depths 4,8,16,32 -qt-mouse-tslib -I/usr/local/tslib-1.3/include -L/usr/local/tslib-1.3/lib
#./configure -prefix /fl2440 -release -shared -fast -pch -no-qt3support -qt-sql-sqlite -no-libtiff -no-libmng -qt-libjpeg -qt-zlib -qt-libpng -qt-freetype -no-openssl -nomake examples -nomake demos -nomake tools -optimized-qmake -no-phonon -no-nis -no-opengl -no-cups -no-xcursor -no-xfixes -no-xrandr -no-xrender -no-xkb -no-sm -no-xinerama -no-xshape -no-separate-debug-info -xplatform qws/linux-arm-g++ -embedded arm -depths 16 -no-qvfb -qt-gfx-linuxfb -no-gfx-qvfb -no-kbd-qvfb -no-mouse-qvfb -qt-kbd-usb -confirm-license -qt-mouse-tslib -I/home/mytslib/include -L/home/ mytslib/lib
上面最后一句“-I/home/mytslib/include -L/home/ mytslib/lib ”指明我们刚才编译出来触摸屏的库文件及头文件存放路径。它前面的“-qt-mouse-tslib”表示将使用触摸屏。
然后执行:
#gmake
#gmake install
上面编译时间较长,一般要2到3个小时。
这样,嵌入式版本的qt4装成功了,若想进行交叉编译,首先也得改变环境变量,所以也可以在当前目录下建一个环境变量的文件setenv-embedded.sh 如下:
#gedit setenv-embedded.sh
这时跳出一个编辑文本输入:
PATH=/fl2440/bin:$PATH
QTDIR=/fl2440
MAINPATH=$QTDIR/man:$MAINPATH
LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
export PATH QTDIR MAINPATH LD_LIBRARY_PATH
保存退出。每次进行qt4-embedded的交叉编译前先# source setenv-embedded.sh,注意我们在编译QT应用程序时要用到上述变量。下文会提到。
下面移植相关库文件至开发板
我是这样做的,我在我xp下建立两个文件夹fl2440和tslib,然后COPY我们刚才编译生成的一些库文件及配置文件至开发板上的fl2440, tslib。我是利用u盘来挂载的,所以将上面的两个文件下拷到u盘里的文件夹rootfs里。这样以后我将生成的可执行文件放进rootfs里就可以了,但还有下面需要做的。
在打开开发板将u盘挂载进mnt/nfs之后,输入一下内容即可
export QTDIR=/mnt/nfs/rootfs/fl2440
export T_ROOT=/mnt/nfs/rootfs/tslib
export PATH=$QTDIR/bin:$PATH
export TSLIB_CONSOLEDEVICE=none
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_TSDEVICE=/dev/touchscreen/0raw
export TSLIB_PLUGINDIR=$T_ROOT/lib/ts
export TSLIB_CONFFILE=$T_ROOT/etc/ts.conf
export TSLIB_CALIBFILE=/etc/pointercal
export QWS_MOUSE_PROTO="slib:/dev/touchscreen/0raw"
export LD_LIBRARY_PATH=$T_ROOT/lib:$QTDIR/lib
export QT_QWS_FONTDIR=/mnt/nfs/rootfs/fl2440/lib/fonts
export QWS_SIZE=320x240
测试触摸屏校正
在开发板终端下执行:
#./ts_calibrate ---------触摸较正程序
运行该程序后,屏幕将出现五点校正画面,依次点击五点后,将生成触摸屏校正数据文件/etc/pointercal.
#./ts_test ----------触摸屏拖曳测试程序
运行后屏幕出现drag,draw 依次选择后进行测试,同时终端下出现拖曳后的取点数据。
那么这样嵌入式版本的qt环境就搭建好了。可能有的地方我说的不好或者不准确,希望大家指正。有的地方我也说的不是很清楚可能是表达的问题的吧,如果大家有问题可以给我留言。