Linux学习 : 移植qt 5.6.3 及 tslib 1.4

摘要:
(1) 移植qt5.6.3 I.qt:qt简介:qt是QtCompany于1991年开发的一个跨平台C++图形用户界面应用程序开发框架。Qt是一个面向对象的框架。它使用特殊的代码生成扩展和一些宏。Qt易于扩展,并允许真正的组件编程。2008年,Qt公司技术被诺基亚收购,Qt成为诺基亚的编程语言工具。2012年,Qt被Digia收购。

                             (一) 移植 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模块有变化

       如下:

         Linux学习 : 移植qt 5.6.3 及 tslib 1.4第1张

  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    
    vibuild.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++编译器不可用的错误提示:
    Linux学习 : 移植qt 5.6.3 及 tslib 1.4第2张
 
从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的链接错误:
Linux学习 : 移植qt 5.6.3 及 tslib 1.4第3张

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

Linux学习 : 移植qt 5.6.3 及 tslib 1.4第4张

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

问题3:

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

Linux学习 : 移植qt 5.6.3 及 tslib 1.4第5张

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

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

免责声明:文章转载自《Linux学习 : 移植qt 5.6.3 及 tslib 1.4》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇1.oracle的备份和恢复之expdp和impdp命令01实现简单的AOP前置后置增强下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

ubuntu 交叉编译qt 5.7 程序到 arm 开发板

ubuntu 交叉编译qt 5.7 程序到 arm 开发板平台1 ubuntu 12.042 arm-linux-gcc 4.5.13 QT 5.74 开发板210 armcortex-A8  一 概述QT5的ARM移植及其中文显示 二 准备工具1.交叉编译工具(arm-linux-gnueabi-4.5.1.tar.bz2)2.交叉编译好的Qt库(arm...

linux系统常用运维命令

目录/文件处理命令 mkdir dirname 创建文件夹 mkdir -p /tmp/a/b 递归创建目录 rm -rf dirname 删除目录及内部文件 -r:表示递归删除文件及文件夹;-f:表示强制删除,不提示 touch filename 创建文件 mv ins.war ins_new.war 重命名 mv ins.war webapps/ 移动...

[转]使用Linux 文本工具简化数据的提取

http://www.sudu.cn/info/html/edu/20080407/263375.html 非常多 Linux® 系统管理员都需要做一些整理纯文本设置文件的乏味工作。幸运的是,Linux 有非常多源自于 UNIX® 的数据提取工具,包括 head、tail、grep、egrep、fgrep、cut、paste、join、awk 等。本文给出...

Linux 如何杀死僵尸进程

问题描述: shell > top top - 11:14:17 up 630 days, 21:23, 1 user, load average: 0.23, 0.81, 1.07 Tasks: 389 total, 1 running, 385 sleeping, 0 stopped, 3 zombie Cpu(s): 3...

Linux下TortoiseGit 配置管理环境搭建

RedHat Git服务器安装安装前准备:需要安装zlib,curl,rsync,libcrypto.可以用# rpm -qa|grep zlib 命令检查安装配置1. 下载git-1.7.8.rc3.tar.gz2. 解压后执行   #configure --prefix=/usr/local/git   #make   #make install3....

linux下搭建lamp环境以及安装swoole扩展

一、CentOS 6.5/CentOS 6.9使用yum快速搭建LAMP环境 准备工作:先更新一下yum源  我安装的环境是:apache2.2.15+mysql5.5.60+php5.6.36 输入下面命令: yum -y update 1、安装Apache [root@localhost ~]# yum -y install httpd # 开机自启动...