• Qt4.8.6 Embedded Linux 的编译与移植


            最近买了个飞凌ok6410 的开发板,于是在其中搭建qt4.8.6运行环境。费了两三天时间,主要还是对Linux系统的生疏,在一些问题上徘徊很久,在这里做一些过程笔记。烧写ARM-Linux系统,根据飞凌官方的用户手册成功为开发板烧写了U-boot、kernel3.0.1、以及rootfs.yaffs(均由飞凌官方提供)。

    编译环境:

    PC:Ubuntu12.04 LTS,Vmware Workstation 10.0.5 build-2443746

    Qt:4.8.6 qt-everywhere-opensource-src-4.8.6.tar.gz

    tslib:未使用开发板提供的tslib1.4

    交叉编译器:arm-linux-gcc-4.3.2

    编译准备:

    1.依赖包安装

    纯净版的Ubuntu没有g++需要先安装:

    1. apt-get install g++  
    apt-get install g++

    另外很多参考资料中安装如下几个依赖包:libX11-dev libXext-dev libXtst-dev,虽然不知道具体依赖关系,安装上总不会错。命令:

    1. apt-get install libX11-dev libXext-dev libXtst-dev  
    apt-get install libX11-dev libXext-dev libXtst-dev

    2.交叉编译器:

            最开始采用arm-linux-gcc-4.4.3版本交叉编译qt4.8.6的过程十分顺利,但将库移植到ok6410开发板后,运行使用qt4.8.6编译的程序,报错:GLIBC2.9 not found,经过多番查实,主要问题在于飞凌官方提供的文件系统所使用的glibc(2.8)与Ubuntu12.04的glibc(2.15)的版本不匹配,于是试图去升级开发板glibc版本,但水平有限无果(如果没有把握自己定制内核、文件系统,而且时间紧迫的情况下,不建议去折腾,学习目的除外)。最后交叉编译器使用的是4.3.2版本

    3.关于tslib版本的几点说明:

            最开始使用的是开发板提供的tslib1.4,tslib的交叉编译安装过程十分简单。但在移植qt库和环境变量后,运行交叉编译的qt程序,arm开发板显示屏可以呈现程序界面,说明qt库移植基本OK,但触摸屏无法移动,并且超级终端显示错误 "Couldnt load module pthres QWSTslibMouseHandlerPrivate: ts_config() failed with error: 'No such file or directory' Please check your tslib installation!",网上一些资料提到可能是开发板提供的tslib版本太旧了,抱着试一试的心态,下载了最新的tslib,最后就没出现上述问题,也说明了我的环境变量设置的正确性。

    这样获得的tslib源代码是最新的,目前是稳定版本。 

    Tslib和Qt在开发板上的移植

    主要参考博客:

    http://www.cnblogs.com/Jasonsblog/p/3757985.html或者http://www.cnblogs.com/emouse/archive/2013/01/29/2881311.html

    另外风间一叶的《linux arm Qt 移植配置 一键推送远程调试 视频教程 》;

    qt4.8.6编译过程中遇到的问题:

    1)缺少链接库:

    1. /usr/local/tslib/lib/libts.a(ts_load_module.o): In function `__ts_load_module':  
    /usr/local/tslib/lib/libts.a(ts_load_module.o): In function `__ts_load_module':
    1. ts_load_module.c:(.text+0x80): undefined reference to `dlopen'  
    ts_load_module.c:(.text+0x80): undefined reference to `dlopen'
    1. ts_load_module.c:(.text+0x90): undefined reference to `dlsym'  
    ts_load_module.c:(.text+0x90): undefined reference to `dlsym'
    1. ts_load_module.c:(.text+0xf0): undefined reference to `dlclose'  
    ts_load_module.c:(.text+0xf0): undefined reference to `dlclose'
    1. ts_load_module.c:(.text+0x120): undefined reference to `dlclose'  
    ts_load_module.c:(.text+0x120): undefined reference to `dlclose'
    1. ts_load_module.c:(.text+0x158): undefined reference to `dlclose'  
    ts_load_module.c:(.text+0x158): undefined reference to `dlclose'
    1. collect2: ld returned 1 exit status  
    collect2: ld returned 1 exit status
    1. make[1]: *** [../../lib/libQtGui.so.4.8.6] 错误 1  
    make[1]: *** [../../lib/libQtGui.so.4.8.6] 错误 1
    1. make[1]:正在离开目录 `/lsj_pro/qt-everywhere-opensource-src-4.8.6/src/gui'  
    make[1]:正在离开目录 `/lsj_pro/qt-everywhere-opensource-src-4.8.6/src/gui'
    1. make: *** [sub-gui-make_default-ordered] 错误 2  
    make: *** [sub-gui-make_default-ordered] 错误 2

         解决方案:

    修改./src/gui/Makefile

    1. ...  
    2. LIBS          = $(SUBLIBS)  -L/usr/local/tslib-1.4/lib -L/home/work/qt/qt-4.7.0-arm/lib -lQtNetwork -L/usr/local/tslib-1.4/lib -L/home/work/qt/qt-4.7.0-arm/lib -lQtCore -lpthread -lts  
    3. ...  
    ...
    LIBS          = $(SUBLIBS)  -L/usr/local/tslib-1.4/lib -L/home/work/qt/qt-4.7.0-arm/lib -lQtNetwork -L/usr/local/tslib-1.4/lib -L/home/work/qt/qt-4.7.0-arm/lib -lQtCore -lpthread -lts
    ...
    在末尾添加库libdl库,这个库用于动态连接库的操作:
    1. ...  
    2. LIBS          = $(SUBLIBS)  -L/usr/local/tslib-1.4/lib -L/home/work/qt/qt-4.7.0-arm/lib -lQtNetwork -L/usr/local/tslib-1.4/lib -L/home/work/qt/qt-4.7.0-arm/lib -lQtCore -lpthread -lts -ldl  
    3. ...  
    ...
    LIBS          = $(SUBLIBS)  -L/usr/local/tslib-1.4/lib -L/home/work/qt/qt-4.7.0-arm/lib -lQtNetwork -L/usr/local/tslib-1.4/lib -L/home/work/qt/qt-4.7.0-arm/lib -lQtCore -lpthread -lts -ldl
    ...

     

    保存后退出,切换至源码目录下继续make -j4。

    2)undefined reference to `__sync_sub_and_fetch_4':

    造成这个原因主要是gcc版本问题。

              解决方案(http://blog.csdn.net/zpzkitt/article/details/8970626):

    1.下载gcc源码:我后来使用的4.4.3的(系统自带的gcc-4.6.3的貌似用不成),解压,在gcc-4.4.3/gcc/config/arm/目录下找到一个linux-     atomic.c;

    2.制作链接库:使用libtool制作,输入命令 

     

    1. libtool --tag=CC --mode=compile arm-linux-gcc -g -O2 -MT linux-atomic.lo -MD -MP -MF linux-atomic.Tpo -c -o linux-atomic.lo linux-atomic.c   
    libtool --tag=CC --mode=compile arm-linux-gcc -g -O2 -MT linux-atomic.lo -MD -MP -MF linux-atomic.Tpo -c -o linux-atomic.lo linux-atomic.c 

    然后:

     

    1. libtool --tag=CC --mode=link arm-linux-g++ -g -O2 -o liblinux-atomic.la linux-atomic.lo  
     libtool --tag=CC --mode=link arm-linux-g++ -g -O2 -o liblinux-atomic.la linux-atomic.lo

    这一步会在当前目录生成.libs目录;

    3.将生成的库拷贝到一个比较短的目录,比如/opt:

     

    1. cp .libs/liblinux-atomic.a /opt  
    cp .libs/liblinux-atomic.a /opt

    4.修改Qt的Makefile:

    进入Qt源码目录:

    cd qt-everywhere-opensource-src-4.8.6

    然后:vim src/script/Makefile

    修改:在LIBS  = 。。。。。。。。。。。。。的结尾添加-L/opt  -llinux-atomic

              保存,继续make -j4,最后执行make install就OK了。

    移植库至开发板并设置环境变量

    1. /usr/local/tslib/etc/ts.conf拷贝至开发板/etc/,切换至/usr/local/tslib/lib/目录,将除pkconfig目录外的文件拷贝至开发板/lib/;
    2. 打包qt库,我用了别人写好的一个脚本mk_qt4_target,打包好在当前目录生成压缩包target-qte-4.8.6.tar.bz2,拷贝至开发板根目录,解压即可在/usr/local/下看到需要的qt库文件;
    3. 环境变量脚本qt4_en.sh,内容如下:
    1. #!/bin/sh  
    2. if [ -c /dev/input/event2 ]; then  
    3. INPUT_PATH=/dev/input  
    4. else  
    5.      INPUT_PATH=/dev  
    6. fi  
    7. export TSLIB_TSDEVICE=/dev/input/event2  
    8. export TSLIB_CONFFILE=/etc/ts.conf  
    9. export TSLIB_PLUGINDIR=/lib/ts  
    10. export TSLIB_CALIBFILE=/etc/pointercal  
    11. export QTDIR=/usr/local/Trolltech/QtEmbedded-4.8.6-arm/  
    12. export PATH=$QTDIR/bin:$PATH  
    13. export LD_LIBRARY_PATH=$QTDIR/lib  
    14. export QWS_MOUSE_PROTO="Tslib:$INPUT_PATH/event2"  
    15. #export QWS_MOUSE_PROTO="Tslib:$INPUT_PATH/event2 MouseMan:$INPUT_PATH/mouse1"  
    16. export QWS_KEYBOARD=TTY:/dev/tty1  
    17. #sync font size with QtDesigner   
    18. export QWS_DISPLAY="LinuxFB:mmWidth200:0"  
    19. export QWS_SIZE="480x272"  
    20. export KDEDIR=/opt/kde  
    21. export HOME=/root  
    #!/bin/sh
    if [ -c /dev/input/event2 ]; then
    INPUT_PATH=/dev/input
    else
         INPUT_PATH=/dev
    fi
    export TSLIB_TSDEVICE=/dev/input/event2
    export TSLIB_CONFFILE=/etc/ts.conf
    export TSLIB_PLUGINDIR=/lib/ts
    export TSLIB_CALIBFILE=/etc/pointercal
    export QTDIR=/usr/local/Trolltech/QtEmbedded-4.8.6-arm/
    export PATH=$QTDIR/bin:$PATH
    export LD_LIBRARY_PATH=$QTDIR/lib
    export QWS_MOUSE_PROTO="Tslib:$INPUT_PATH/event2"
    #export QWS_MOUSE_PROTO="Tslib:$INPUT_PATH/event2 MouseMan:$INPUT_PATH/mouse1"
    export QWS_KEYBOARD=TTY:/dev/tty1
    #sync font size with QtDesigner 
    export QWS_DISPLAY="LinuxFB:mmWidth200:0"
    export QWS_SIZE="480x272"
    export KDEDIR=/opt/kde
    export HOME=/root

    以上是我的开发板配置,具体的设置还需要根据开发板硬件做相应的修改。

    运行测试:

    在QtCreator3.3.0中设计简单UI,并编译拷贝至开发板运行,应用程序名:helloworld 

    运行:

    1. ./helloword -qws  
        ./helloword -qws
    效果如下,点击触摸屏有反应,鼠标箭头可以移动

  • 相关阅读:
    2171 棋盘覆盖
    [网络流24题] 骑士共存
    COGS28 [NOI2006] 最大获利[最大权闭合子图]
    1066: [SCOI2007]蜥蜴
    1877: [SDOI2009]晨跑
    POJ 2125 Destroying the Graph 二分图最小点权覆盖
    LA 3231
    3028: 食物
    PYOJ 44. 【HNSDFZ2016 #6】可持久化线段树
    1597: [Usaco2008 Mar]土地购买
  • 原文地址:https://www.cnblogs.com/lvdongjie/p/6101977.html
Copyright © 2020-2023  润新知