Qt4.8.5在ARM9开发板上的移植
以前移植过qtopia-embedded-2.2.0,俗称Qt/E,在早期的Qt框架中是使用X11桌面服务器系统,无法应用于嵌入式平台,为此产生了qtopia,qtopia2.2.0就是一款针对嵌入式小资源平台的GUI系统,他是直接操作嵌入式系统显示设备的FramerBuffer,精简高效。但这是一款过时的产品,奇趣公司在Qt的4.5.0的时候,将Qt/E纳入了Qtopia,推出Qtopia4,可以使用在任何平台上,只需在编译时做相应的配置,这次我们就将移植Qt4.8.5到S3C2440开发板。
主机环境:Ubuntu12.04 LTS
编译器:arm-linux-gcc 4.4.3
开发板:JZ2440,Linux-2.6.32.12
一. 首先得搞定驱动的问题,主要是触屏的驱动和LCD的驱动,我是直接将两个驱动编译进内核了,针对不同的开发板,驱动是不同的,LCD驱动可以直接移植,但是触屏驱动需要自己写,具体的驱动可以参考友善之臂的触屏驱动。这里不再详细赘述。
二. 编译tslib库:
由于Qt的运行会调用tslib的库,所以先移植安装tslib,下载tslib-1.4的压缩文件,百度上到处都有下载的,下载后解压,如果你使用的是4.4.3的编译器的话,一定要注意配置。
解压后进入目录:
cd tslib
首先安装autoconfig工具:
sudo apt-get install autoconf
sudo apt-get install automake
sudo apt-get install libtool
然后依次执行:
sudo ./autogen.sh
mkdir tmp
sudo echo "ac_cv_func_malloc_0_nonnull=yes" >arm-linux.cache
sudo ./configure --host=arm-none-linux-gnueabi
--cache-file=arm-linux.cache --prefix=$(pwd)/tmp
CC=/usr/local/arm-tool/bin/arm-linux-gcc CXX=/usr/local/arm-tool/bin/arm-linux-g++
export CC=/usr/local/arm-tool/bin/arm-linux-gcc
export CXX=/usr/local/arm-tool/bin/arm-linux-g++
上面需要注意的就是一定要指定交叉编译器的绝对路径,我就是在这个地方弄了好长时间,编译后的文件总是X86的,指定成绝对路径就是交叉编译器了,而且host选项必须是和编译器名一致,而不是编译器的链接名。
接下来:sudo make;然后sudo make install
这时就能看到tmp目录下多了编译后的库文件。在开发板的根目录的opt目录中建立tslib,这个目录将是tslib目录的安装位置,最好使用先使用nfs挂载根文件系统,这样可以减少烧写flash的次数,有利于保护开发板,将刚才tmp目录下的所有文件全部拷贝过来,这里我选择全部拷贝。
三:编译移植Qt4.8.5
至此,tslib安装结束,下面编译Qt库,下载qt-everywhere-opensource-src-4.8.5.tar.gz,官网有下载,下载后解压进入目录,先要配置,最好写一个配置文件
vim autoconfig.sh
内容为:
#!/bin/sh
sudo ./configure
-prefix /usr/local/qte-arm/
-force-pkg-config
-opensource
-confirm-license
-release -shared
-embedded arm
-xplatform qws/linux-arm-gnueabi-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
其中的配置选项根据自己的需要添加或删减,选项说明直接./configure --help就出来了,当然上面的可以直接拷贝。
然后sudo chmod autoconfig.sh 777增加可执行权限,最后sudo ./autoconfig.sh
即可配置,这里说明一点,-force-pkg-config选项增加后会有警告,直接忽略,但是如果不加的话,则会出错,这个错误是谷歌了好长时间才解决的。
配置到一半的时候,肯定会弹出类似的错误,
The tslib functionality test failed!
You might need to modify the include and library search paths by editing QMAKE_INCDIR and QMAKE_LIBDIR in
/qt-embedded-linux-opensource-src-4.8.5-arm/mkspecs/qws/linux-arm-g++
没关系,这个错误有两个原因,一个是没加额外的tslib的链接库文件,还记得刚才编译tslib时用的tmp目录么,现在就要用了,还有一个就是编译器要使用绝对路径,这就是4.4.3版本坑爹的地方,我是试了好长时间才发现的,一开始以为是tslib编译错了,后来发现是编译器要使用绝对路径而不是环境变量。
打开mkspecs/qws/linux-arm-gnueabi-g++目录下的qmake.conf文件,修改编译器为绝对路径,并添加刚刚那个tmp目录中的库目录,也是绝对路径,我的设置是:
主要是QMAKE_INCDIR和QMAKE_LIBDIR,对应于你自己编译tslib的库目录。
然后重新sudo ./autoconfig.sh,
接下来,就是sudo make,这个过程是个很长的过程,make完了后,sudo make install,就会安装到你设置的目录下,就是-prefix /usr/local/qte-arm/配置选项的目录,但是不知道为什么,我的配置了,他给我安装到了usr的下的默认的目录下了,默认的是/usr/local/Trolltech,但最后的提示确实我配置的目录,显得有点坑爹。至此编译就结束了,一般是不会出错的。在开发板的根文件系统的opt目录下建立Qte目录,
再进入Qt安装目录下,将其中的四个目录:imports lib mkspecs plugins复制到,/opt/Qte下,也可将demos也复制过来,因为待会要测试,就使用他的程序了。
四. 测试:
将/opt/tslib/etc/下的ts.conf打开,将
# module_raw input一行前面的符号和空格去掉,注意空格也不能留。
配置环境变量:
export TSLIB_ROOT=/opt/tslib
export TSLIB_TSDEVICE=/dev/event0
export TSLIB_FBDEVICE=/dev/fb0
export TSLIB_PLUGINDIR=/opt/tslib/lib/ts
export TSLIB_CONSOLEDEVICE=none
export TSLIB_CONFFILE=/opt/tslib/etc/ts.conf
export POINTERCAL_FILE=/etc/pointercal
export TSLIB_CALIBFILE=/etc/pointercal
export QWS_SIZE=480x272
export QWS_MOUSE_PROTO=Tslib:/dev/event0
export QTDIR=/opt/Qte
export QPEDIR=/opt/Qte
export PATH=$QTDIR/bin:$PATH
export QWS_DISPLAY=LinuxFb:/dev/fb0
export LD_LIBRARY_PATH=$TSLIB_ROOT/lib:$QTDIR/lib:$LD_LIBRARY_PATH
export QT_QWS_FONTDIR=$QTDIR/lib/fonts
如果你的开发板刚刚的目录设置和我一样的话,可以直接使用,不同的话根据自己的设置配置,根据环境变量的名字应该能看出每个目录代表什么,主要就是tslib和Qt的安装目录,同时配置屏幕的大小,我的是480X272的,还有就是输入子系统的文件节点,基本都差不多的。OK,下面,将demos下的一个可执行文件随便拷贝一个过来,先进入tslib的bin目录,执行./ts_calibrate校准触屏,然后执行一个Qt程序,./textedit -qws就可以看到打开了一个文本编辑器,./mainwindow -qws就可以打开一个窗口界面,
这些程序在demos目录下需要拷贝到开发板上执行,执行成功则说明移植成功,接下来,编写一个脚本文件,将上述环境变量的设置写入脚本文件,开机执行,并且在/etc/init.d/rcS中写入开机启动Qt程序的命令,则开机即可看到优美的GUI界面了,OK。至此,移植完成。