嵌入式linux之QT5.6移植 1
1.1 简介 1
1.2 移植 2
1.2.1 源码下载链接 2
1.2.2 移植准备工作 3
1.2.3 解压qt源码包 3
1.2.4 配置编译环境 3
1.2.5 删除目录 4
1.2.6 生成Makefile 5
1.2.7 编译安装 5
1.2.8 编译成功 6
1.2.9 添加环境变量 6
1.2.10 查看qmake版本 7
1.2.11 编译ARM版的QT程序 7
1.3 部署开发板运行环境 7
1.3.1 拷贝QT运行库 7
1.3.2 libiconv库下载 8
1.3.3 创建相关配置文件 8
1.3.4 拷贝QT依赖库 9
1.3.5 QT中文支持 9
1.3.6 开发板运行效果 10
1.3.7 鼠标设置方法 11
嵌入式linux之QT5.6移植
嵌入式linxu内核版本:3.5.0
交叉编译器:arm-linux-gcc 4.5.1
宿主机:redhat红帽6.3
1.1 简介
Qt 是一个跨平台的C 图形用户界面应用程序框架。它提供给开发者建立图形用户界面所需的功能,广泛用于开发GUI程序,也可用于开发非GUI程序。Qt是完全面向对象的,很容易扩展,并且允许真正地组件编程。
作为一款领先级的跨平台C 图形用户界面应用程序框架,Qt提供给开发者建立图形用户界面所需的功能,广泛用于开发GUI程序,也可用于开发非GUI程序。Qt完全面向对象、且模块化程度更高,易与扩展,并且允许真正组件编程。此外,Qt支持更多的平台与丰富的API,支持2D/3D 图形渲染、OpenGL、大量的开发文档、XML等等。
在2015世界峰会上,Qt就曾宣布,Qt5.6将作为一款受长期支持的旗舰版本引领Qt5系列。自三年前Qt5.0问世以来,历经洗炼,不断成长,直至近日Qt公司才决定借此成熟时机发布该款日臻完满的长期版本。这意味着Qt5.6将享有三年的技术支持,且此后的支持服务亦可通过购买获得。其间兼容各种新版本的同步更新,漏洞修复,安全升级,并支持新操作系统和编译器等。
Qt5.6 最新特性:
n 新持续集成系统。由于Qt每一版本的发布都历经了各式平台各类配置的反复测试,这便对其背后的相 应支持基础设施要求极高。此次Qt5.6便应用到了其新持续集成系统以极大节省系统及CPU时间;
n 高分辨率支持。可使标清标准下开发的应用自动调整至高清显示,而不同显示设备间也可通过字体、图标、图片等元素的调整依像素配置自动相互转换。
n 全面支持Windows10。在5.5的基础上更进一步,全面支持Win32及WinRT的API。台式机,平板电脑和Windows Phone上所有Qt应用均可通过Windows商店发布和获取。一般来说,对于32位系统应用,兼容至Win10和WinRT直如重新开发,但通过Qt,只需要对您的应用做一个简单的重新编译即可轻松实现。另外,5.6在本次Win10的全面支持中还为MS Visual Studio2015提供了预设文件库,并将随着5.6.0的发布更新其VS插件。
1.2 移植
1.2.1 源码下载链接
官网下载链接:http://download.qt.io/archive/qt/
图1-1 最新版本5.6
图1-2 选择单一的压缩包
图1-3 选择linux格式的压缩包下载
1.2.2 移植准备工作
1.需要提前移植好交叉编译器,如果编译QT时出现错误,大半都是编译器版本太低引起的,低版本的编译器编译QT会出现错误。
2.移植前需要先移植好tslib库,tslib 是电阻式触摸屏用于校准的一个软件库,是一个开源的程序,能够为触摸屏驱动获得的采样提供诸如滤波、去抖、校准等功能,通常作为触摸屏驱动的适配层,为上层的应用提供了一个统一的接口。操作触摸屏时,QT需要依赖tslib获取屏幕坐标。
1.2.3 解压qt源码包
代码语言:javascript复制[root@xiaolong qt5.6]# tar xvf qt-everywhere-opensource-src-5.6.0
[root@xiaolong qt5.6]# cd qt-everywhere-opensource-src-5.6.0
1.2.4 配置编译环境
代码语言:javascript复制[root@xiaolong qt-everywhere-opensource-src-5.6.0]# gedit qtbase/mkspecs/linux-arm-gnueabi-g /qmake.conf
qmake.conf 文件内容如下:
代码语言:javascript复制#
# qmake configuration for building with arm-linux-gnueabi-g
#
MAKEFILE_GENERATOR = UNIX
CONFIG = incremental
QMAKE_INCREMENTAL_STYLE = sublib
QT_QPA_DEFAULT_PLATFORM = linuxfb #eglfs
QMAKE_CFLAGS_RELEASE = -O2 -march=armv7-a
QMAKE_CXXFLAGS_RELEASE = -O2 -march=armv7-a
include(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g -unix.conf)
# modifications to g .conf
QMAKE_CC = /work/arm-linux-gcc/opt/FriendlyARM/toolschain/4.5.1/bin/arm-none-linux-gnueabi-gcc
QMAKE_CXX = /work/arm-linux-gcc/opt/FriendlyARM/toolschain/4.5.1/bin/arm-none-linux-gnueabi-g
QMAKE_LINK = /work/arm-linux-gcc/opt/FriendlyARM/toolschain/4.5.1/bin/arm-none-linux-gnueabi-g
QMAKE_LINK_SHLIB = /work/arm-linux-gcc/opt/FriendlyARM/toolschain/4.5.1/bin/arm-none-linux-gnueabi-g
# modifications to linux.conf
QMAKE_AR = /work/arm-linux-gcc/opt/FriendlyARM/toolschain/4.5.1/bin/arm-none-linux-gnueabi-ar cqs
QMAKE_OBJCOPY = /work/arm-linux-gcc/opt/FriendlyARM/toolschain/4.5.1/bin/arm-none-linux-gnueabi-objcopy
QMAKE_NM = /work/arm-linux-gcc/opt/FriendlyARM/toolschain/4.5.1/bin/arm-none-linux-gnueabi-nm -P
QMAKE_STRIP = /work/arm-linux-gcc/opt/FriendlyARM/toolschain/4.5.1/bin/arm-none-linux-gnueabi-strip
load(qt_config)
注:上面蓝色部分的是修改部分,需要根据自己的实际情况进行修改。
修改说明:
n QT_QPA_DEFAULT_PLATFORM选项是指定图形插件, Qt5将各平台底层抽象为一个 qpa 插件,通常在mac上是cocoa, 在window上是windows, 在linux X11下是xcb, 如果有OPENGL支持, 那么选eglfs。而对于无硬件加速的设备,则选择linuxfb。
n armv7-a :是当前CPU的构架,需要根据当前的CPU实际构架填写。
通过交叉编译器查看当前处理器构架:
代码语言:javascript复制[root@xiaolong qt-everywhere-opensource-src-5.6.0]# arm-none-linux-gnueabi-gcc --target-help
n /work/arm-linux-gcc/opt/FriendlyARM/toolschain/4.5.1/bin/ :是交叉编译器的路径,需要根据自己的交叉编译器路径填写。
1.2.5 删除目录
代码语言:javascript复制[root@xiaolong qt-everywhere-opensource-src-5.6.0]# rm qt3d qtcanvas3d qtweb* -fr
如果没有修改,编译时会出现如下的错误:
图1-5错误信息
1.2.6 生成Makefile
代码语言:javascript复制[root@xiaolong qt-everywhere-opensource-src-5.6.0]#
./configure -release -opensource -xplatform linux-arm-gnueabi-g -prefix $PWD/tmp -no-c 11 -no-opengl -no-dbus
说明:
$PWD/tmp :配置安装的路径。
查看配置的帮助信息:
代码语言:javascript复制[root@xiaolong qt-everywhere-opensource-src-5.6.0]# ./configure -help
1.2.7 编译安装
代码语言:javascript复制[root@xiaolong qt-everywhere-opensource-src-5.6.0]# make && make install
编译过程需要持续1到3个小时。
图1-6 编译成功
1.2.8 编译成功
代码语言:javascript复制[root@xiaolong tmp]# ls
bin doc examples include lib mkspecs plugins qml translations
编译成功生成的文件。
bin目录下存放了qmake命令。
1.2.9 添加环境变量
为了方便使用qmake命令,可以将bin目录加入到系统的环境变量PATH中。
代码语言:javascript复制[root@xiaolong bin]# pwd
/work/qt5.6/qt_5.6/qt-everywhere-opensource-src-5.6.0/tmp/bin
[root@xiaolong bin]# gedit /etc/profile
图1-7 添加环境变量
使修改的/etc/profile文件立即生效:
代码语言:javascript复制[root@xiaolong bin]# source /etc/profile
1.2.10 查看qmake版本
代码语言:javascript复制[root@xiaolong /]# qmake -v
QMake version 3.0
Using Qt version 5.6.0 in /work/qt5.6/qt_5.6/qt-everywhere-opensource-src-5.6.0/tmp/lib
1.2.11 编译ARM版的QT程序
① 先创建一个完整的QT工程。
代码语言:javascript复制[root@xiaolong window_1]# ls
main.cpp mainwindow.h win_1.h window_1 mainwindow.cpp mainwindow.ui win_1.cpp win_1.ui window_1.pro
② 使用qmake命令构建Makefile
代码语言:javascript复制[root@xiaolong window_1]# qmake
[root@xiaolong window_1]# ls
main.cpp mainwindow.h Makefile win_1.h window_1 window_1.pro.user
mainwindow.cpp mainwindow.ui win_1.cpp win_1.ui window_1.pro
③ 编译程序
代码语言:javascript复制[root@xiaolong window_1]# make
[root@xiaolong window_1]# ls
main.cpp mainwindow.h Makefile moc_win_1.cpp ui_win_1.h win_1.o window_1.pro
main.o mainwindow.o moc_mainwindow.cpp moc_win_1.o win_1.cpp win_1.ui
mainwindow.cpp mainwindow.ui moc_mainwindow.o ui_mainwindow.h win_1.h window_1
window_1:编译生成的可执行程序。可以直接拷贝到开发板运行。
代码语言:javascript复制示例: ./window_1
1.3 部署开发板运行环境
1.3.1 拷贝QT运行库
先创建一个文件夹qt5.6_lib,用来存放相关的代码!将QT编译生成的lib 目录和 plugins 目录,拷贝到qt5.6_lib目录下,然后再将qt5.6_lib目录拷贝至开发板根文件系统待用!
操作步骤如下:
代码语言:javascript复制① [root@xiaolong window_1]# cd /work/qt5.6/qt_5.6/qt-everywhere-opensource-src-5.6.0/tmp/
② [root@xiaolong tmp]# ls
bin doc examples include lib mkspecs plugins qml translations
③ [root@xiaolong tmp]# mkdir qt5.6_lib
④ [root@xiaolong tmp]# cp lib plugins qt5.6_lib/ -rfd
⑤ [root@xiaolong tmp]# cd qt5.6_lib/
⑥ [root@xiaolong qt5.6_lib]# ls
lib plugins
1.3.2 libiconv库下载
QT程序在运行时需要依赖libiconv库。
更新libiconv库,到iconv官网下载最新的库源码包,下载地址为:
http://ftp.gnu.org/gnu/libiconv/libiconv-1.14.tar.gz
编译步骤:
在libiconv目录下:
./configure --prefix=PWD/temp --host=arm-linux
$make
$make install
上述命令执行完成后会在libiconv目录下生成新的temp目录,该目录下存在4个目录分别是:
代码语言:javascript复制bin include lib share
在lib目录下为生成的库文件,其中一个为preloadable_libiconv.so,把它下载到开发板的lib目录下,然后再设置开发板的系统环境变量即可:
代码语言:javascript复制$ export LD_PRELOAD=/lib/preloadable_libiconv.so
1.3.3 创建相关配置文件
① 在/qt5.6_lib下创建一个配置文件(qt5.6_path.config),用来存放QT相关的环境变量设置。
内容如下:
#QT相关的路径
export QTDIR=/qt5.6_lib
#设置共享库路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$QTDIR/lib
#键盘
export QT_QPA_ENABLE_TERMINAL_KEYBOARD=/dev/input/event1
#鼠标节点
export QT_QPA_FB_HIDECURSOR=/dev/input/event4
#触摸屏的节点
export QT_QPA_FB_TSLIB=/dev/input/event2
#字体库目录
export QT_QPA_FONTDIR=$QTDIR/lib/fonts
#图形插件平台
export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0
#平台插件
export QT_QPA_PLATFORM_PLUGIN_PATH=$QTDIR/plugins
export LD_PRELOAD=$QTDIR/lib/preloadable_libiconv.so
② 创建一个qt5.6_config.sh 脚本文件,用来开机自动加载QT的配置。该脚本只是用来方便移植使用,只需要在移植的时候执行一次,以后就不需要再执行。
内容如下:
代码语言:javascript复制#!/bin/bash
grep -q "source /qt5.6_lib/qt5.6_path.config" ../etc/profile||echo "source /qt5.6_lib/qt5.6_path.config">>../etc/profile
1.3.4 拷贝QT依赖库
QT运行时需要用到ibjpeg.so.8、libpng14.so.14 等一系列库。这些库在交叉编译器目录下已经编译好,直接拷贝到开发板的lib目录下即可。
库存放的路径:
代码语言:javascript复制/work/arm-linux-gcc/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/sys-root/usr/lib
拷贝示例:
代码语言:javascript复制[root@xiaolong lib]# pwd
/work/arm-linux-gcc/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/sys-root/usr/lib
[root@xiaolong lib]# cp ./* /work/rootfs/lib/ -fd
1.3.5 QT中文支持
Qt的字体目录是根据自己在PC机的QT源码编译安装目录有关。
比如我在PC端编译安装QT源码的目录如下:
代码语言:javascript复制/work/qt5.6/qt_5.6/qt-everywhere-opensource-src-5.6.0/tmp/
那么QT字体的目录就是:
代码语言:javascript复制/work/qt5.6/qt_5.6/qt-everywhere-opensource-src-5.6.0/tmp/lib/fonts
如果想让QT显示中文,可以将windows下的中文字体拷贝到QT的字体库目录下。
图1-8 Windows下的字体
1.3.6 开发板运行效果
图1-9 运行效果图
图1-10 运行效果图
图1-11
1.3.7 鼠标设置方法
如果输入源不想使用触摸屏,可以直接使用USB鼠标代替。
环境变量配置如下:
#QT相关的路径
export QTDIR=/qt5.6_lib
#设置共享库路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$QTDIR/lib
#键盘
export QT_QPA_ENABLE_TERMINAL_KEYBOARD=/dev/input/event1
#鼠标节点
export QT_QPA_FB_HIDECURSOR=/dev/input/event4
#触摸屏的节点
export QT_QPA_FB_TSLIB=/dev/input/event2
#字体库目录
export QT_QPA_FONTDIR=$QTDIR/lib/fonts
#图形插件平台
export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0
#平台插件
export QT_QPA_PLATFORM_PLUGIN_PATH=$QTDIR/plugins
export LD_PRELOAD=$QTDIR/lib/preloadable_libiconv.so