(一) 移植 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./bin/../lib/gcc/arm-none-linux-gnueabi/4.4./../../../../arm-none-linux-gnueabi/bin/ld: warning: libm.so., needed by /home/sheldon/workSpace/tool/arm-linux-4.4./bin/../lib/gcc/arm-none-linux-gnueabi/4.4./../../../../arm-none-linux-gnueabi/lib/libstdc++.so, not found (try using -rpath or -rpath-link)
/home/sheldon/workSpace/tool/arm-linux-4.4./bin/../lib/gcc/arm-none-linux-gnueabi/4.4./../../../../arm-none-linux-gnueabi/lib/libstdc++.so: undefined reference to `asin@GLIBC_2.'
/home/sheldon/workSpace/tool/arm-linux-4.4./bin/../lib/gcc/arm-none-linux-gnueabi/4.4./../../../../arm-none-linux-gnueabi/lib/libstdc++.so: undefined reference to `log@GLIBC_2.'
/home/sheldon/workSpace/tool/arm-linux-4.4./bin/../lib/gcc/arm-none-linux-gnueabi/4.4./../../../../arm-none-linux-gnueabi/lib/libstdc++.so: undefined reference to `fmod@GLIBC_2.'
/home/sheldon/workSpace/tool/arm-linux-4.4./bin/../lib/gcc/arm-none-linux-gnueabi/4.4./../../../../arm-none-linux-gnueabi/lib/libstdc++.so: undefined reference to `sin@GLIBC_2.'
/home/sheldon/workSpace/tool/arm-linux-4.4./bin/../lib/gcc/arm-none-linux-gnueabi/4.4./../../../../arm-none-linux-gnueabi/lib/libstdc++.so: undefined reference to `tanh@GLIBC_2.'

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

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-
 
 

Linux学习 : 移植qt 5.6.3 及 tslib 1.4的更多相关文章

  1. Linux下移植QT(2)---移植QT

    准备:ubantu12.04   内核 3.0.8(最好用同样的内核,3.2.0时没成功) 交叉编译工具:arm-cortex_a8-linux-gnueabi-gcc-4.4.6 QT版本5.4.2 ...

  2. Linux 下移植QT(1)---tslib 1.4.0移植

    步骤1:下载工具包 如下图 链接在此,点我. 步骤2:将tslib文件放入Linux虚拟机中, 步骤3:解压源码 tar -xvf tslib-1.4.tar cd tslib-1.4 步骤4:执行a ...

  3. 嵌入式Linux学习笔记(六) 上位机QT界面实现和串口通讯实现

    目录 (1).参考资料 (2).QT界面布局实现 (3).数据和操作逻辑 在上一章我们实现了下位机的协议制定,并通过串口通讯工具完成了对设备内外设(LED)的状态修改,下面就要进行上位机软件的实现了( ...

  4. MiniCRT 64位 linux 系统移植记录:64位gcc的几点注意

    32位未修改源码与修改版的代码下载: git clone git@github.com:youzhonghui/MiniCRT.git MiniCRT 64位 linux 系统移植记录 MiniCRT ...

  5. 【转】嵌入式Linux学习笔记

    一  嵌入式系统定义: 应用于特定环境的硬件体系. 二  两样非常重要的能力: 1.  掌握各种新概念的能力 2.  调试的能力( 包括软件, 硬件 ) 三  需要的基础知识: 1.  操作系统理论基 ...

  6. 【课程分享】深入浅出嵌入式linux系统移植开发 (环境搭建、uboot的移植、嵌入式内核的配置与编译)

    深入浅出嵌入式linux系统移植开发 (环境搭建.uboot的移植.嵌入式内核的配置与编译) 亲爱的网友,我这里有套课程想和大家分享,假设对这个课程有兴趣的,能够加我的QQ2059055336和我联系 ...

  7. 嵌入式Linux学习小结

    这两个月一直在学习Linux.作为一名刚開始学习的人,学习期间难免磕磕碰碰.走弯路,可是,抱着不怕失败.多尝试的信念,终于还是坚持下来了. 如今已经清楚Linux的框架,知道怎么去开发一个Linux程 ...

  8. 我的Linux学习历程:那些我看过的Linux书籍们

    [+]查看原图http://www.ituring.com.cn/article/119401 来北京工作已经一个多月,大都市的生活比起读大学要忙碌得多,尤其是出行,基本以小时为基本的计时单位.有时茫 ...

  9. linux学习:【第1篇】初识Linux及安装

    狂神声明 : 文章均为自己的学习笔记 , 转载一定注明出处 ; 编辑不易 , 防君子不防小人~共勉 ! linux学习:[第1篇]初识Linux及安装 写在前面 学习之初看了一段文章,很有感触,所以也 ...

随机推荐

  1. Mongodb 分享(一)

    Mongodb使用基础知识: 一.简介 1.mongodb是什么? 1)MongoDB 是一个基于分布式文件存储的数据库.由 )mongodb 客户端:NoSQL Manager for MongoD ...

  2. spring容器bean的作用域 & spring容器是否是单例的一些问题

    Spring容器中Bean的作用域 当通过Spring容器创建一个Bean实例时,不仅可以完成Bean实例的实例化,还可以为Bean指定特定的作用域.Spring支持如下5种作用域: singleto ...

  3. TCHART类型

    private Steema.TeeChart.Styles.Pie pieSeries1; private Steema.TeeChart.Styles.Pie pieSeries2; privat ...

  4. 雷林鹏分享:jQuery EasyUI 窗口 - 自定义带有工具条和按钮的对话框

    jQuery EasyUI 窗口 - 自定义带有工具条和按钮的对话框 您可以创建一个带有工具栏(toolbar)和按钮(button)的对话框(dialog),可以从 HTML 标记创建.这个教程描述 ...

  5. BFS+二进制状态压缩 hdu-1429

    好久没写搜索题了,就当练手吧. vis[][][1025]第三个维度用来维护不同key持有状态的访问情况. 对于只有钥匙没有对应门的位置,置为'.',避免不必要的状态分支. // // main.cp ...

  6. android studio 中的快捷键汇总

    1.Ctrl + B 跳入/跳出方法或者资源文件.将鼠标光标定位到某个方法或者资源id的调用处,按Ctrl + B,将会跳入该方法或者资源文件内部,功能等同于Ctrl + 鼠标左键.如果将鼠标光标定位 ...

  7. 获取在线python 文档

    window cmd    :python -m pydoc -p 8888

  8. MySql之行记录的详细操作,创建用户以及库表的授权

    一 介绍 MySQL数据操作: DML ======================================================== 在MySQL管理软件中,可以通过SQL语句中的 ...

  9. IntelliJ IDEA的调试方法

    快捷键F9          resume programe       恢复程序 Alt+F10       show execution point    显示执行断点 F8          S ...

  10. 4月22 mysql常用函数

    一.数学函数 数学函数主要用于处理数字,包括整型.浮点数等. ABS(x) 返回x的绝对值 SELECT ABS(-1) -- 返回1 CEIL(x),CEILING(x) 返回大于或等于x的最小整数 ...