使用DirecetFB支持Qt4.7.0
摘要:如何在ok6410上使用Directfb,并且使用它支持Qt4.7.0 关键字:directfb 1.2.8 Qt4.7.0 tslib ok6410 1.前言: 很久之前就已经听说过directFb,但实际上由于时间和精力的关系,一直没有去好好地了解。这次小师弟的项目在Qt的刷新效率上出现了瓶颈,想到directfb具有硬件图形加速功能,于是就向他推荐了。同时,帮人帮到底,打算自己先做一遍,再告诉他方法。 实际上做了之后,曲折程序大大出乎我意料,在途中碰到了好几个问题,历经波折,最后发现可能是由于在软件版本方面导致了我过程的艰难。由于个人喜 好,diretfb我选取了最新的1.4.5,导致最后启动Qt时,出现了启动直接崩溃的问题,虽然打开了debug模式,阅读了近4000多行的run log,但是也没有解决。 而最后,发现在ubunut10.04里使用的directfb是1.2.8的版,我也选用了该版本,在相同的流程后,Qt例程很正常地启动,并且触摸校准也可用,再次验证折腾linux下的,版本间的组合可以让人疯狂。 这次花费四天的工作,让我发现网上Qt+directfb资料极其稀少,至少笔者没有找可以一用的教程,所以记录下这篇心得,希望可以帮助后来者。 准备工作: 硬件环境: 主机 Ubuntu10.4 开发板 ok6410 2.软件环境: 已配置好的ok6410交叉编译工具链 Qt4.7.0源码包http://qt.nokia.com/downloads Tslib Directfb1.2.8源码包 http://www.directfb.org/index.php?path=Main%2FDownloads DirectFB-example1.2.0源码包 http://www.directfb.org/index.php?path=Main%2FDownloads&page=1 Tslib1.0源码包 http://github.com/kergoth/tslib/downloads Libjpegv8b源码包 http://www.ijg.org/ Libpng1.2.44源码包 http://www.libpng.org/pub/png/libpng.html Zlib1.2.5源码包 http://www.zlib.net/ Freetype源码包 http://freetype.sourceforge.net/index2.html 其中,除了libpng和directfb,其他软件都是最新的版本。关于directfb依赖的软件,我们可以看源码目录下的README文件,里面清晰地描述了directfb必要的软件,关于这方面,随着对directfb的深入,可能会逐步讲述。 ×××完毕后,统一放在/home/cnnbboy/directFb目录下 3.实际操作: 3.1directfb移植 要是Qt4.7.0跑在directfb之上,就要先把directfb移植到板子上,并且测试通过。而在编译Directfb前,需要将必要的源码包安装完毕 (1)tslib1.0编译安装 先解压源码 #tar xvf kergoth-tslib-1.0-0-gd7f5dae.tar.gz 目录名字更改下并且进入 #mv kergoth-tslib-1.0-0-gd7f5dae tslib-1.0 #cd tslib-1.0 然后进行编译编译安装 #./autogen.sh #./configure –prefix=/home/cnnbboy/tslib-arm –host=arm-linux ac_cv_func_malloc_0_nonnull=yes #make #make install 最后导入一个环境变量,用于准备最后的directFb编译用 #export TSLIB=/home/cnnbboy/tslib-arm (2)libjpeg编译安装 先解压源码 #tar xvf jpegsrc.v8b.tar.gz #cd jpeg-8b 配置编译安装 #./configure –host=arm-linux –prefix=/home/cnnbboy/libjpeg-arm –enable-shared #make #make install 导入环境变量 #export LIBJPEG=/home/cnnbboy/libjpeg-arm (3)libpng编译安装 先解压源码 #tar xvf libpng-1.2.44.tar.gz/ #cd libpng-1.2.44 配置编译安装 #./configure –host=arm-linux –prefix=/home/cnnbboy/libpng-arm #make #make install 导入环境变量 #export LIBPNG=/home/cnnbboy/libpng-arm (4)freetype编译安装 先解压源码 #tar xvf freetype-2.4.2.tar.gz #cd freetype-2.4.2 配置编译安装 #./configure –host=arm-linux –prefix=/home/cnnbboy/freetype-arm #make #make install 导入环境变量 #export FREETYPE=/home/cnnbboy/freetype-arm (5)zlib编译安装 先解压源码 #tar xvf zlib-1.2.5.tar.gz #cd zlib-1.2.5 配置编译安装 #./configure –host=arm-linux –prefix=/home/cnnbboy/zlib-arm #make #make install 导入环境变量 #export ZLIB=/home/cnnbboy/zlib-arm 当以上这些这些软件编译安装完毕后,就可以配置编译directfb了 (6)directfb和directfb-example配置编译安装 编译安装前先导入前面设置的环境变量 export LDFLAGS=“$LDFLAGS -L$TSLIB/lib -L$LIBJPEG/lib -L$LIBPNG/lib -L$FREETYPE/lib -L$ZLIB/lib” export CFLAGS=“$CFLAGS -I$TSLIB/iclude -I$LIBJPEG/include -I$LIBJPEG/include -I$FREETYPE/include -I$ZLIB/include” 这两个环境变量的作用是帮助directfb编译找到需要的库文件和头文件 解压源码目录 #tar xvf DirectFB-1.2.8.tar.gz #cd DirectFB-1.2.8 配置编译安装 #./configure –host=arm-linux –prefix=/home/cnnbboy/directFB-arm –with-gfxdrivers=none –with-inputdrivers=all –enable-png –enable-jpeg –disable-tiff –enable-zlib –enable-sdl=no –enable-gif=no –disable-x11 –enable-debug –sysconfdir=/etc –enable-fbdev 配置参数并不打算在这里详细讲解了,因为主要是为Qt所用,而不是直接用directfb进行UI的开发。 #make #make install 导入环境变量 #export DIRECTFB=/home/cnnbboy/directFB-arm 安装完毕后,就可以移植了,同时为了检测direct是否可用,另外也编译directfb-example 先清除原有环境变量,导入新的环境变量 #unset LDFLAGS #unset CFLAGS export LDFLAGS=“$LDFLAGS -L$TSLIB/lib -L$LIBJPEG/lib -L$LIBPNG/lib -L$FREETYPE/lib -L$ZLIB/lib -L$DIRECTFB/lib” export CFLAGS=“$CFLAGS -I$TSLIB/iclude -I$LIBJPEG/include -I$LIBJPEG/include -I$FREETYPE/include -I$ZLIB/include -I$DIRECTFB/include” 原理同前面一样,解压源码 #tar xvf DirectFB-examples-1.2.0.tar.gz #cd DirectFB-examples-1.2.0.tar.gz 配置编译安装 #./configure –host=arm-linux –prefix=/home/cnnbboy/directFB-example #make #make install 安装完毕后,就可以开始移植,并在ok6410板子上测试 (7)移植directfb并测试 同样,在以前的文章里笔者已经有ok6410的NFS环境的搭建,只要把相关文件拷贝进入即可,在主机终端里执行 #cp -r /home/cnnbboy/directFB-arm /forlinx/root/home/cnnbboy #cp -r /home/cnnbboy/directFB-example /forlinx/root/home/cnnbboy #cp -r /home/cnnbboy/tslib-arm /forlinx/root/home/cnnbboy #cp -r /home/cnnbboy/libjpeg-arm /forlinx/root/home/cnnbboy #cp -r /home/cnnbboy/libpng-arm /forlinx/root/home/cnnbboy #cp -r /home/cnnbboy/freetype-arm /forlinx/root/home/cnnbboy #cp -r /home/cnnbboy/zlib-arm /forlinx/root/home/cnnbboy 然后,启动kermit,进入开发板终端 #ls -l /home/cnnbboy/directFB-arm #ls -l /home/cnnbboy/directFB-example 可以发现文件都已经存在,然后设置开发板环境,准备测试directfb例程 export TSLIB=/home/cnnbboy/tslib-arm export LIBJPEG=/home/cnnbboy/libjpeg-arm export LIBPNG=/home/cnnbboy/libpng-arm export FREETYPE=/home/cnnbboy/freetype-arm export ZLIB=/home/cnnbboy/zlib-arm export DIRECTFB=/home/cnnbboy/directFB-arm export TSLIB_CONSOLEDEVICE=none export TSLIB_FBDEVICE=/dev/fb0 export TSLIB_TSDEVICE=/dev/input/event1 export TSLIB_PLUGINDIR=$T_ROOT/lib/ts export TSLIB_CONFFILE=$T_ROOT/etc/ts.conf export TSLIB_CALIBFILE=/etc/pointercal export LD_LIBRARY_PATH=$TSLIB/lib:$LIBJPEG/lib:$LIBPNG/lib:$FREETYPE/lib:$ZLIB/lib:$DIRECTFB/lib 这是从理论下,directfb应当可以跑起来了,当然准备的例程就是为了测试用,不过千万别忘忘了在/etc目录下配置directfbrc #vi /etc/directfbrc 添加 system=fbdev fbdev=/dev/fb0 wm=default 然后保存退出 最后,就可以测试了 #cd /home/cnnbboy/directFB-arm/bin #ls 可以看到许多directfb的程序 #./dfbinfo 顺利启动后,就可以看到directr启动的相关信息 至此,directfb的移植就完成,下面就是Qt4.7.0进行基于directfb的编译和移植 3.2 Qt4.7.0基于directfb的编译安装移植 Qt文档是做得十分出色的,所以关于支持directfb内容,是能在Qt的文档中找到的http://doc.qt.nokia.com/4.7/qt-embeddedlinux-directfb.html
在细节上不清楚的部分,可以去仔细阅读文档
(1)在Qt4.7.0的编译参数的改变 如果要让Qt4.7.0能使用directfb,那配置参数也要加上 ./configure -plugin-gfx-directfb ./configure -qt-gfx-directfb 这两个配置参数是选择性的 (2)修改qmake.conf 注意,根据自己目标平台来选择,比如笔者针对的是arm-linux,那qmake.conf就应该应该修改在Qt源码目录下 $QTSOURCE/mkspecs/qws/linux-arm-g++的目录 添加如下两句 QT_CFLAGS_DIRECTFB = -I/home/cnnbboy/directFB-arm -D_REENTRANT QT_LIBS_DIRECTFB = -L/home/cnnbboy/directFB-arm /lib/-ldirect -ldirectfb -lfusion 注意目录应该是针对自己directfb的安装目录 (3)配置编译安装Qt4.7.0 解压Qt4.7.0源码,并且进入 #tar xvf qt-everywhere-opensource-src-4.7.0.tar.gz #cd qt-everywhere-opensource-src-4.7.0.tar.gz 配置编译安装Qt4.7.0 #./configure -release -shared -fast -no-largefile -qt-sql-sqlite -no-webkit -qt-zlib -qt-gif -qt-libtiff -qt-libpng -qt-libmng -qt-libjpeg -make libs -nomake tools -nomake examples -nomake docs -nomake demo -xplatform qws/linux-arm-g++ -embedded arm -little-endian -qt-freetype -depths 16,18 -no-gfx-linuxfb -no-gfx-transformed -no-gfx-multiscreen -no-gfx-vnc -no-gfx-qvfb -qt-gfx-directfb -I/home/cnnbboy/directFB-arm/include -L/home/cnnbboy/directFB-arm/lib -no-glib -qt-mouse-tslib -I/home/cnnbboy/tslib-arm/include -L/home/cnnbboy/tslib-arm/lib #make #make install 安装完毕后,就能进行移植了 (4)移植基于directfb的Qt4.7.0 前面有文章已经描述过Qt4.7.0的移植了,因此过程简单描述下 #cd /usr/local/Trolltech/QtEmbedded4.7.0-arm #sudo cp -r lib/ plugins/ /forlinx/root/usr/local/Trolltech/QtEmbedded4.7.0-arm 这样,如果使用NFS启动,在开发板终端发现就能发现已经存在这些文件了 (5)例程测试 为了验证功能是否正常,应当编译一个小程序来运行看看,先进入编译的Qt源码目录,进入后 #cd example/mainwindows/application #/usr/local/Trolltech/QtEmbedded4.7.0-arm/bin/qmake #make 生成application程序后,拷贝至开发板NFS的目录 #cp application /forlinx/root/home/cnnbboy 最后,就是执行程序测试 #./application -qws -display directfb 在终端上首先会出现directfb的启动log,然后开发板上就会顺利出现application的界面,当界面出现的那瞬间,对于历尽艰难的笔者来说,是无比的喜悦。 4.总结 对于过程出现的问题,也是需要解决的 (1)directfb编译依赖其他的软件库,因此要确定之前编译安装软件路径的正确 (2)在PC上directfb安装的目录在哪,那在开发板上就应该对应一致,不然就会出现system not found的现象,更为深层次是由于directfb在加载是会加载模块,如果在配置时没有指定,而开发板上安装位置和PC不一致,自然就无法找到 (3) 软件版本不要选太新,笔者就是吃了版本组合的亏,白白浪费2天在解决不知名的错误上,同时directfb应该和libpng对应,当笔者选用 directfb1.2.x时,libpng选用1.4.x,就出现在了 can not find -lpng12,说明libpng需要1.2.x版本才可以通过 (4)最后编译Qt测试例程时,如果出现undefined reference to `ts_read_raw’这样的错误,请修改qmake.conf文件,添加-lts参数,如下 QMAKE_CC = arm-linux-gcc -lts QMAKE_CXX = arm-linux-g++ -lts QMAKE_LINK = arm-linux-g++ -lts QMAKE_LINK_SHLIB = arm-linux-g++ -lts 这个是Qt4.7.0的bug,与tslib和directfb无关。 5.参考文献 (1)Qt for Embedded Linux and DirectFB http://doc.qt.nokia.com/4.7/qt-embeddedlinux-directfb.html (2)嵌入式linux GUI–DirectFB + GTK至尊秘笈 http://www.directfb.com.cn/viewthread.php?tid=383 (3)DirectFB wiki http://www.directfb.org/wiki/index.php/Main_Page