sheldon_blogs

Linux学习 : 移植qt 5.6.3 及 tslib 1.4

                             (一) 移植 qt5.6.3

一、qt简介:

  Qt是一个1991年由Qt Company开发的跨平台C++图形用户界面应用程序开发框架。它既可以开发GUI程序,也可用于开发非GUI程序,比如控制台工具和服务器。Qt是面向对象的框架,使用特殊的代码生成扩展(称为元对象编译器(Meta Object Compiler, moc))以及一些宏,Qt很容易扩展,并且允许真正地组件编程。

  2008年,Qt Company科技被诺基亚公司收购,Qt也因此成为诺基亚旗下的编程语言工具。2012年,Qt被Digia收购。2014年4月,跨平台集成开发环境Qt Creator 3.1.0正式发布,实现了对于iOS的完全支持,新增WinRT、Beautifier等插件,废弃了无Python接口的GDB调试支持,集成了基于Clang的C/C++代码模块,并对Android支持做出了调整,至此实现了全面支持iOSAndroidWP,它提供给应用程序开发者建立艺术级的图形用户界面所需的所有功能。基本上,Qt 同 X Window 上的 Motif,Openwin,GTK 等图形界 面库和 Windows 平台上的 MFC,OWL,VCL,ATL 是同类型的东西。

 

 二、编译:

(1)下载对应QT安装包及源码:

    http://download.qt-project.org/archive/

(2)编译环境配置:

    apt-get install lib32ncurses5 lib32z1
    apt-get install gcc-multilib g++-multilib

    环境变量添加:/usr/lib/gcc/x86_64-linux-gnu/4.8/

  PS:各编译器版本的差异:

    1、arm-none-linux-gnueabi (ARM architecture, no vendor, linux OS, and the gnueabi ABI)
            用于编译ARM架构的u-boot、linux内核、linux应用等
    2、arm-none-eabi
            用于编译ARM架构的裸机系统(包括linux的 boot、kernel)
    3、arm-eabi
            Android ARM 编译器

 

(3)配置&编译:

  1.修改 qt-everywhere-opensource-src-5.6.3/qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf  指定编译器如下 (根据自己环境配置):

# modifications to g++.conf
QMAKE_CC                = arm-linux-gcc
QMAKE_CXX               = arm-linux-g++
QMAKE_LINK              = arm-linux-g++
QMAKE_LINK_SHLIB        = arm-linux-g++

# modifications to linux.conf
QMAKE_AR                = arm-linux-ar cqs
QMAKE_OBJCOPY           = arm-linux-objcopy
QMAKE_NM                = arm-linux-nm -P
QMAKE_STRIP             = arm-linux-strip
load(qt_config)

针对2440增加如下:

QT_QPA_DEFAULT_PLATFORM = linuxfb
QMAKE_CFLAGS += -ldl -msoft-float -D__GCC_FLOAT_NOT_NEEDED -march=armv4t -mtune=arm920t
QMAKE_CXXFLAGS += -ldl -msoft-float -D__GCC_FLOAT_NOT_NEEDED -march=armv4t -mtune=arm920t      

 # march 指的 cpu 架构,针对 2440 来说是 armv4t    、   mtune 指的 cpu 名字,针对 2440 来说是 arm920t

   

    2.增加一个编译配置脚本 build.sh,内容如下:

./configure \
-verbose \
-prefix  $(pwd)/out/QtEmbedded-arm \
-opensource \
-release \
-confirm-license \
-xplatform linux-arm-gnueabi-g++ \
-shared \
-qt-zlib \
-no-gif \
-qt-libjpeg \
-no-opengl \
-no-cups \
-no-glib \
-no-dbus \
-no-rpath \
-no-sse2 -no-sse3 -no-ssse3 -no-sse4.1 -no-sse4.2 \
-no-avx  \
-no-openssl \
-nomake tools \
-qreal float \
-qt-libpng \
-tslib \
-ldl \
-nomake examples \
-I/home/sheldon/workspace/tslib/out/tslib/include -L/home/sheldon/workspace/tslib/out/tslib/lib     #这里可参考 (二) 移植 tslib 部分编译好tslib库
 

       3.编译打包QT移植到arm开发板:

      ./build.sh && make && make install
      
以上三个步骤没问题的话,在out/QtEmbedded-arm 目录下生成编译输出文件,拷贝需要的文件到开发板新建的Qt5.6目录(libplugins)。

  4.设置QT环境变量:

    文件系统 /etc/profile 里添加:

       export QTEDIR=/usr/local/Qt5.6
       export LD_LIBRARY_PATH=/usr/local/Qt5.6/lib:$LD_LIBRARY_PATH
       export QT_QPA_GENERIC_PLUGINS=tslib
       export QT_QPA_FONTDIR=$QTEDIR/lib/fonts
       export QT_QPA_PLATFORM_PLUGIN_PATH=$QTEDIR/plugins
       export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0:size=480x272:mmSize=480x272:offset=0x0:tty=/dev/tty1
       export QT_QPA_FB_TSLIB=1

       红色部分请根据自己的开发板进行修改,JZ2440 V3开发板是 4.3 寸 480*272 的 LCD。

 

    5.测试QT库:

(1)修改ubuntu主机默认qmake路径:
  vi /usr/lib/x86_64-linux-gnu/qt-default/qtchooser/default.conf     
  修改第一行为本机qt源码交叉编译路径: /home/sheldon/workSpace/jz2440/qt-everywhere-opensource-src-5.6.3/out/QtEmbedded-arm/bin     (qmake  arm版本)

(2)编译测试源码  hello.cpp:

#include <QApplication>
#include <QLabel>

int main(int argc, char **argv)
{
    QApplication app(argc, argv);
    QLabel *label = new QLabel;
    label->setText("hello to World!");
    label->show();

    return app.exec();
}
  

  顺序执行以下操作:  (qmake是qt源码编译生成的arm版本)

  1. 执行:qmake -project hello.cpp -o ./hello.pro           生成 hello.pro 工程文件;

       qmake hello.pro   ,然后提示如下警告
       WARNING: Failure to find: /qt_test.cpp ,修改hello.pro:

           (1)删除: hello.cpp

           (2)增加:greaterThan(QT_MAJOR_VERSION, 4): QT += widgets      #qt5模块有变化

       如下:

         

 

  2. 执行:qmake  hello.pro      生成 Makefile 文件    (可以打开查看一下)  

  3. 执行:make                生成 hello.o 及 hello可执行文件,拷贝到arm开发板运行即可看到 hello to World! 显示;

 

       异常:

     执行   ./hello  报错: /lib/libc.so.6: version `GLIBC_2.9' not found (required by /usr/local/Qt5.6/lib/libQt5Core.so.5)

/mnt/qt_project #  strings /lib/libc.so.6 | grep GLIBC_      (指令查看支持的版本只支持到2.8)
      GLIBC_2.4
      GLIBC_2.5
      GLIBC_2.6
      GLIBC_2.7
      GLIBC_2.8
      GLIBC_PRIVATE

更新内核版本

更新glibc库:(申明:如果更新的so不能用会导致系统瘫痪,请君三思而为!!!)

   (1)glibc源码下载: http://ftp.gnu.org/gnu/glibc/

    源码包:glibc-2.14.tar.gz

    补丁包:glibc-ports-2.14.tar

   (2)解压后将补丁glibc-ports-2.14 拷贝到 glibc-2.14目录中并命名为 ports,单独建立目录及配置脚本:
    mv glibc-ports-2.14 glibc-2.14/ports 
    mkdir glibc-2.14
    cd glibc-2.4    
    vi build.sh ,内容如下:

 CC=arm-linux-gcc CXX=arm-linux-g++ AR=arm-linux-ar RANLIB=arm-linux-ranlib \
../configure \
--prefix=/home/sheldon/workspace/mount/glibc-2.14/out \
--host=arm-linux \
--build=x86_64-linux-gnu \
--enable-add-on \
libc_cv_forced_unwind=yes \
libc_cv_c_cleanup=yes  \
libc_cv_gnu99_inline=yes \

     然后更新so:

      cp ./ld-linux.so.3  /lib/
      cp ./libc.so.6  /lib/libc.so.6 

 

 

 

                      (二) 移植 tslib

一、tslib简介:

  在采用触摸屏的移动终端中,触摸屏性能的调试是个重要问题之一,因为电磁噪声的缘故,触摸屏容易存在点击不准确、有抖动等问题。Tslib是一个开源的程序,能够为触摸屏驱动获得的采样提供诸如滤波、去抖、校准等功能,通常作为触摸屏驱动的适配层,为上层的应用提供了一个统一的接口。
 
tslib插件 pthres 为Tslib 提供的触摸屏灵敏度门槛插件;variance 为Tslib 提供的触摸屏滤波算法插件;dejitter 为Tslib 提供的触摸屏去噪算法插件;linear 为Tslib 提供的触摸屏坐标变换插件。 
 
二、移植tslib-1.4到ARM平台:
 1.安装必要的工具和库:sudo apt-get install g++-multilib libx11-dev libxext-dev libxtst-dev zlib1g-dev lib32ncurses5 lib32z1 libpng-dev autoconf automake libtool
 2.解压 tslib-1.4.tar.gz 后进入tslib目录:
   cd tslib
     ./autogen.sh    
   ./configure --host=arm-linux ac_cv_func_malloc_0_nonnull=yes CC=arm-none-linux-gnueabi-gcc CXX=arm-none-linux-gnueabi-g++  \
       --prefix=$(pwd)/out --cache-file=arm-linux.cache
      make
      make install
 3.tslib 就安装在 --prefix= 指定的目录下,分别是 /bin , /etc , /include , /lib  ,将生成的目录拷贝到arm平台系统上,如:/usr/local/tslib/ 目录下,
 并将测试程序所需依赖的动态库拷贝到系统/lib目录 : cp /usr/local/tslib/lib/*so* /lib
 4.更改 tslib 配置文件:
      cd /usr/local/tslib/etc/  
      sudo vi ts.conf   ---> 去掉 # module_raw input 前面的 “#” 和空格
 
 5.添加 tslib 环境变量:  (触摸屏驱动正常会有对应设备节点/dev/eventx,需确认对应event几设置)
  export TSLIB_TSDEVICE=/dev/event0        #指定触屏设备
  export TSLIB_CALIBFILE=/etc/pointercal       #指定触摸屏校准文件 pintercal 的存放位置
  export TSLIB_CONFFILE=/usr/local/tslib/etc/ts.conf     #指定 TSLIB 配置文件的位置
  export TSLIB_PLUGINDIR=/usr/local/tslib/lib/ts             #指定触摸屏插件所在路径
  export TSLIB_CONSOLEDEVICE=none                        #设定控制台设备为 none ,否则默认为 /dev/tty
  export TSLIB_FBDEVICE=/dev/fb0         #指定帧缓冲设备(lcd)
 
       以上设置可添加到 /etc/profile 永久生效;
 

  6.以上步骤已经完成tslib移植,可以通过 /usr/local/tslib/bin 目录下的可执行文件进行测试:

  ./ts_calibrate    (触摸屏矫正)
       ./ts_test    (触摸屏测试)

 
问题1:
  ./configure 时遇到提示c++编译器不可用的错误提示:
   
 
从config.log中看详细的原因是 libstdc++.so 库文件不兼容导致:
/home/sheldon/workSpace/tool/arm-linux-4.4.3/bin/../lib/gcc/arm-none-linux-gnueabi/4.4.3/../../../../arm-none-linux-gnueabi/bin/ld: warning: libm.so.6, needed by /home/sheldon/workSpace/tool/arm-linux-4.4.3/bin/../lib/gcc/arm-none-linux-gnueabi/4.4.3/../../../../arm-none-linux-gnueabi/lib/libstdc++.so, not found (try using -rpath or -rpath-link)
/home/sheldon/workSpace/tool/arm-linux-4.4.3/bin/../lib/gcc/arm-none-linux-gnueabi/4.4.3/../../../../arm-none-linux-gnueabi/lib/libstdc++.so: undefined reference to `asin@GLIBC_2.4'
/home/sheldon/workSpace/tool/arm-linux-4.4.3/bin/../lib/gcc/arm-none-linux-gnueabi/4.4.3/../../../../arm-none-linux-gnueabi/lib/libstdc++.so: undefined reference to `log@GLIBC_2.4'
/home/sheldon/workSpace/tool/arm-linux-4.4.3/bin/../lib/gcc/arm-none-linux-gnueabi/4.4.3/../../../../arm-none-linux-gnueabi/lib/libstdc++.so: undefined reference to `fmod@GLIBC_2.4'
/home/sheldon/workSpace/tool/arm-linux-4.4.3/bin/../lib/gcc/arm-none-linux-gnueabi/4.4.3/../../../../arm-none-linux-gnueabi/lib/libstdc++.so: undefined reference to `sin@GLIBC_2.4'
/home/sheldon/workSpace/tool/arm-linux-4.4.3/bin/../lib/gcc/arm-none-linux-gnueabi/4.4.3/../../../../arm-none-linux-gnueabi/lib/libstdc++.so: undefined reference to `tanh@GLIBC_2.4'

 从较新的交叉编译工具中拷贝该库过来,并重新建立链接:

sudo cp ../arm-linux-gcc-4.5.1/arm-none-linux-gnueabi/lib/libstdc++.so.6.0.14 ../arm-linux-4.4.3/arm-none-linux-gnueabi/lib/

ln -s ../arm-linux-4.4.3/arm-none-linux-gnueabi/lib/libstdc++.so.6.0.14  ../arm-linux-4.4.3/arm-none-linux-gnueabi/lib/libstdc++.so

ln -s ../arm-linux-4.4.3/arm-none-linux-gnueabi/lib/libstdc++.so.6.0.14  ../arm-linux-4.4.3/arm-none-linux-gnueabi/lib/libstdc++.so.6

 
问题2:
  make 时提示libts.so的链接错误:

用 arm-linux-gcc-4.5.1 可以编译通过,对比 arm-linux-gcc-4.4.3 目录发现lib放错位置,修正如下:

 配置好的 arm-linux-gcc-4.4.3 交叉编译工具已上传到百度云 --->  链接:    https://pan.baidu.com/s/1DoS7Kkb-k3mxXAt5ZAL6fQ      提取码:rmr1

 

问题3:

运行tslib测试程序时提示 “selected device is not a touchscreen I understand” :

参考网上的解决方案是需要将内核代码和交叉编译工具的 EV_VERSION 宏定义要一致:

 

内核源码目录: /linux-3.4.83/include/linux/input.h    <--->   交叉编译工具目录:../arm-none-linux-gnueabi/sys-root/usr/include/linux/input.h
 
 
-end-
 
 

posted on 2018-02-26 13:45  sheldon_blogs  阅读(1315)  评论(0编辑  收藏  举报

导航