zoukankan      html  css  js  c++  java
  • 使用DirecetFB支持Qt4.7.0 (十分详细)

    使用DirecetFB支持Qt4.7.0    http://www.cuteqt.com/blog/?p=1931
    摘要:如何在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”
    expoty 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”
    expoty 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
    fbdeb=/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

  • 相关阅读:
    首次使用随便写点哦
    js中call、apply和bind的区别
    前端的事件流以及事件处理程序
    javascript中数组的深拷贝的方法
    我的第一篇博客
    圆盘转动按钮-react native
    鼠标拖拽删除
    js基础 -----鼠标事件(按下 拖拽)
    清除浮动的几种常用方法
    VUE常见问题解决
  • 原文地址:https://www.cnblogs.com/leaven/p/1850129.html
Copyright © 2011-2022 走看看