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支持做出了调整,至此实现了全面支持iOS、Android、WP,它提供给应用程序开发者建立艺术级的图形用户界面所需的所有功能。基本上,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目录(lib和plugins)。
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简介:
./autogen.sh
make install
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)
6.以上步骤已经完成tslib移植,可以通过 /usr/local/tslib/bin 目录下的可执行文件进行测试:
./ts_calibrate (触摸屏矫正)
./ts_test (触摸屏测试)

/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
用 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学习 : 移植qt 5.6.3 及 tslib 1.4的更多相关文章
- 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 ...
- Linux 下移植QT(1)---tslib 1.4.0移植
步骤1:下载工具包 如下图 链接在此,点我. 步骤2:将tslib文件放入Linux虚拟机中, 步骤3:解压源码 tar -xvf tslib-1.4.tar cd tslib-1.4 步骤4:执行a ...
- 嵌入式Linux学习笔记(六) 上位机QT界面实现和串口通讯实现
目录 (1).参考资料 (2).QT界面布局实现 (3).数据和操作逻辑 在上一章我们实现了下位机的协议制定,并通过串口通讯工具完成了对设备内外设(LED)的状态修改,下面就要进行上位机软件的实现了( ...
- MiniCRT 64位 linux 系统移植记录:64位gcc的几点注意
32位未修改源码与修改版的代码下载: git clone git@github.com:youzhonghui/MiniCRT.git MiniCRT 64位 linux 系统移植记录 MiniCRT ...
- 【转】嵌入式Linux学习笔记
一 嵌入式系统定义: 应用于特定环境的硬件体系. 二 两样非常重要的能力: 1. 掌握各种新概念的能力 2. 调试的能力( 包括软件, 硬件 ) 三 需要的基础知识: 1. 操作系统理论基 ...
- 【课程分享】深入浅出嵌入式linux系统移植开发 (环境搭建、uboot的移植、嵌入式内核的配置与编译)
深入浅出嵌入式linux系统移植开发 (环境搭建.uboot的移植.嵌入式内核的配置与编译) 亲爱的网友,我这里有套课程想和大家分享,假设对这个课程有兴趣的,能够加我的QQ2059055336和我联系 ...
- 嵌入式Linux学习小结
这两个月一直在学习Linux.作为一名刚開始学习的人,学习期间难免磕磕碰碰.走弯路,可是,抱着不怕失败.多尝试的信念,终于还是坚持下来了. 如今已经清楚Linux的框架,知道怎么去开发一个Linux程 ...
- 我的Linux学习历程:那些我看过的Linux书籍们
[+]查看原图http://www.ituring.com.cn/article/119401 来北京工作已经一个多月,大都市的生活比起读大学要忙碌得多,尤其是出行,基本以小时为基本的计时单位.有时茫 ...
- linux学习:【第1篇】初识Linux及安装
狂神声明 : 文章均为自己的学习笔记 , 转载一定注明出处 ; 编辑不易 , 防君子不防小人~共勉 ! linux学习:[第1篇]初识Linux及安装 写在前面 学习之初看了一段文章,很有感触,所以也 ...
随机推荐
- Getting Started with Processing 第二,三章总结
第一章是文化熏陶. 第二章:开始编程 菜单栏中的 Show 的快捷键 Run:进行显示shortcut:可以通过快捷键 cmd + R 执行Present:进行全屏的显示shortcut:可以通过按下 ...
- 第十二周(MySort)
注意:研究sort的其他功能,要能改的动代码,需要答辩 模拟实现Linux下Sort -t : -k 2的功能. 要有伪代码,产品代码,测试代码(注意测试用例的设计) 参考 Sort的实现.提交博客链 ...
- English trip V1 - B 1. How much is it? 它是多少钱? Teacher:Corrine Key: is/are
In this lesson you will learn to ask about prices. 本节课你将学习询问关于价格 课上内容(Lesson) one piece of two p ...
- [LintCode] Serialize and Deserialize Binary Tree(二叉树的序列化和反序列化)
描述 设计一个算法,并编写代码来序列化和反序列化二叉树.将树写入一个文件被称为“序列化”,读取文件后重建同样的二叉树被称为“反序列化”. 如何反序列化或序列化二叉树是没有限制的,你只需要确保可以将二叉 ...
- CentOS7 安装redis4:
phpredis-4.0.12.tar.gz:下载:wget http://download.redis.io/releases/redis-4.0.12.tar.gz $ tar -zxvf ...
- locust 学习中
[转自]http://blog.51cto.com/youerning/2089930 前言 都说haproxy很牛x, 可是测试的结果实在是不算满意, 越测试越失望,无论是长连接还是并发, 但是测试 ...
- Java对MongoDB中的数据查询处理
Java语言标准的数据库时MySQL,但是有些时候也会用到MongoDB,这次Boss交代处理MongoDB,所以讲代码以及思路记录下了 摸索的过程,才发现软件的适用还是很重要的啊!!! 我连接的Mo ...
- 『TensorFlow』SSD源码学习_其八:网络训练
Fork版本项目地址:SSD 作者使用了分布式训练的写法,这使得训练部分代码异常臃肿,我给出了部分注释.我对于多机分布式并不很熟,而且不是重点,所以不过多介绍,简单的给出一点训练中作者的优化手段,包含 ...
- [Uva P11168] Airport
题目是英文的,这里就不给出来了. 题目的大意是说,在平面上有n个点,要找一条直线,使所有点到直线的平均距离最小,且这些点都在该直线的同一侧(包括直线上). 那么,既然要使距离最小化,还要使所有点一定在 ...
- 三、持久层框架(Hibernate)
一.Hibernate处理关系 关系主要有三种:1.多对一 2.一对多 3.多对多 1.多对一 一个Product对应一个Category,一个Category对应多个Product(一个产品对应一个 ...