QT/E 4.6.2和tslib 1.4在mini2440上的移植


QT自从被Nokia抢走以后改动比较大,加入了一些新的特性,也变的更加通用,支持更多的平台,也把Trolltech混乱的版本结构理了理,我觉得还是不错的。QT/E 4.6以后的版本都叫做everywhere,可见其野心啊。。。只有4.5以上的版本是用的LGPL,所以不想公开源代码的人要注意了。

本文用的是qt-everywhere-opensource-src-4.6.2.tar.gz,tslib-1.4.tar.gz,Ubuntu 10.04,GCC 4.4.3,arm-linux-gcc 4.3.2,一个华丽的组合,基本都是目前能找到的最新的东东。

由于网上的移植教程泛滥,我就只是大概讲一下我的移植步骤和经验:

1         安装交叉编译工具

   我用的是开发板上的arm-linux-4.3.2,建议用越新的编译器越好,网上用低版本的人都会出现各种错误,不是要改代码就是改配置文件,千万别被忽悠了。

2         编译tslib

我用的tslib1.4,过程中会有一些小问题,网上有解决方法。

./autogen.sh    #用于生成configure脚本,要装autoconf

echo "ac_cv_func_malloc_0_nonnull=yes" >arm-linux.cache  

#产生一个cache文件arm-linux.cache,欺骗configure,tslib的bug

./configure  --host=arm-linux --prefix=/opt/tslib-install --cache-file=arm-linux.cache

make

make install

交叉成功后在目标位置产生/bin、/etc、/include、/lib 4个文件夹。

网上很多人说在configure的时候要加上--enable-inputapi=no,我想请问1.4里有这个选项么,抄帖子为何都不先自己试试,每当这次我就很鄙视把它搜出来的搜索引擎,害人啊害人。网上人加的这个选项估计是—enable-input=no,但这个也是要看情况的,tslib默认会把所有raw module编进去,像笔者用的mini2440的触摸屏就是基于linux的input设备的,把它disable掉肯定就废了,所以建议全部编译才是王道。

 

3         编译QT/E

如果你采用的也是笔者的arm-linux-4.3.2的话,那就什么都不用改,直接配置编译就好,否则的话就去网上找找大家是怎么改代码和配置文件的。

以下是笔者的配置文件:

a)     

#!/bin/sh

 

./configure \

    -embedded arm \

    -prefix /nfs/qt \

    -release -shared \

    -opensource \

    -no-largefile \

    -no-qt3support \

    -xplatform qws/linux-arm-g++ \

    -qt-gif -qt-libpng -qt-libjpeg –qt-zlib \

    -iconv -little-endian -qt-freetype \

    -depths 16,18,24,32 \

    -no-qvfb \

    -qt-sql-sqlite -no-kbd-qvfb -no-mouse-qvfb -no-glib \

    -qt-mouse-tslib \

    -nomake tools \

    -L/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/lib
 


多余的就不解释了,自己应该都可以理解。

1)      -qt-mouse-tslib是为了我们要用tslib;

2)      和qvfb有关的我也全都干掉了,我的理解是有些人为了要在X11上运行、调试,所以要在X11上模拟一个framebuffer,本文是基于一个真实的设备,所以也就不需要了,而且就算想调试,用Windows版的岂不是更爽。

3)      -L/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/lib,这是交叉编译的库文件目录,这个选项一定要有,而且很重要,一定要写对。

接下来就是无聊的configure,make,make install。

其实4.6.2很好编,只要理解configure的内容就好,还有就是不要太相信网上的。

4         应用tslib

把编译好的tslib全部考进开发板,接下来设置一些环境变量:

export TSLIB_ROOT=/home/tslib

export TSLIB_TSDEVICE=/dev/input/event0

export TSLIB_CALIBFILE=/etc/pointercal

export TSLIB_CONFFILE=$TSLIB_ROOT/etc/ts.conf

export TSLIB_PLUGINDIR=$TSLIB_ROOT/lib/ts

export TSLIB_CONSOLEDEVICE=none

export TSLIB_FBDEVICE=/dev/fb0

export LD_LIBRARY_PATH=$TSLIB_ROOT/lib:$LD_LIBRARY_PATH

以上的这样根据自己的开发平台而定。然后要修改一个配置文件。Tslib虽然默认编译了所有的raw module,但是却一个都没有启用,真是另人费解。笔者是把etc/ts.conf里的# module_raw input这行的注释给取消了,配置文件中的其实参数请上网查看。

这样就可以用bin下的测试程序了。这时要想在QT中支持触摸屏的话只需要启动它内嵌的鼠标设备就好了,实际中是设置一个环境变量:

export QWS_MOUSE_PROTO='tslib:/dev/input/event0'

这样就可以开始编程了。

5         总结

虽然我被网上的人浪费了一些时间,总体QT/E还是无罪的,mini2440比pxa270的处理器要弱,但是运行QT的速度感觉差不多,说明QT变快了。以前在pxa270上用的是QT/E 4.4。

触摸屏感觉不错,其实大都的触摸屏都感觉不错的说,只是用亿道的触摸屏用出阴影了。

不知道哪个版本以后的中文字体变正常了,还是以前一直都是正常的只是没用对而已。QT/E 4.6.2中自带的中文字体好像没几个,笔者用的是unifont_160_50.qpf,有点丑,不过至少说明中文是可用的。

好了,移植完毕。

6         FAQ6.1    优化开关

本以为成功的在mini2440上移植了以后可以直接用在micro2440上的,结果,恶心的“segmentation fault”,想了一会儿后猜测可能又是编译器的优化干的好事,修改了mkspecs/common/g++.conf中的QMAKE_CFLAGS_RELEASE为-O0,取消编译优化,结果运行成功,哎,可爱又可恨的-O2,已经好几次了。。。编译优化真的是个很难平衡的东东啊。

6.2    Assistant中不能显示图片

身为一个Assistant,只有文字没有图片。。。哎。。。杯具啊。。。好像很多版本都有这个BUG,以下是diff文件,patch一下再重编Assistant就可以了。

相关内容