您的位置:首页 > 编程语言 > Qt开发

移植QT5.4.0到ARM开发板

2016-05-20 15:48 816 查看
QT5中不再用到QT4中的窗口系统qws++,而是使用QPA系统,二者之间的差异还不清楚,但是程序运行时不需要再加上参数-qws了。而这个特性也导致QT5与QT4的移植过程有一些区别,这里记录一下。

准备工作

1. 主机环境:Ubuntu14.04,开发板:Tiny4412,ARM Cortex-A9处理器。

2. 官网下载源码包

qt-everywhere-opensource-src-5.4.0.tar.gz,这里选择下载的是gz格式的源码包,而不是将源码和qtcreator打包好的run文件。因为试过run文件一方面文件太大,另一方面安装得到的源码包和gz格式的有一些不同,比如找不到qtbase,影响到后续的配置,所以最好选择gz格式。

3. 解压

tar -zxvf qt-everywhere-opensource-src-5.4.0.tar.gz


解压到某些路径下可能需要root权限,我的路径是/opt/qt-everywhere-opensource-src-5.4.0,这里的解压路径关联到后面QtCreator中Kits的路径配置。

4. 配置交叉编译器的路径

修改/etc/profile文件,在系统环境变量PATH中添加交叉编译器的路径。

export PATH=/opt/FriendlyARM/toolschain/4.5.1/bin:$PATH


这是我在/etc/profile文件末尾添加的内容,其中/opt/FriendlyARM/toolschain/4.5.1/bin是交叉编译器的路径。配置完成后使用命令

source /etc/profile


使得环境变量立即生效。配置完成后可以通过

echo $PATH


查看交叉编译器的路径是否已经添加到系统环境变量PATH中。

可以查看交叉编译器的版本号:

arm-linux-gcc -v


如果能够正常显示出交叉编译器的版本号,则说明配置成功。

QT5.4.0的交叉编译

1. 指定目标平台的架构和交叉编译器的类型

QT5中针对不同的目标平台都有相应的配置文件夹,只需修改对应目标平台文件夹中的配置文件qmake.conf。

cd qt-everywhere-opensource-src-5.4.0
vim qtbase/mkspecs/linux-arm-gnueabi-g++/qmake.conf


下面是我修改后的qmake.conf,其中的内容需要根据自己的实际情况去修改。

#
# qmake configuration for building with arm-linux-gnueabi-g++
#

MAKEFILE_GENERATOR      = UNIX
CONFIG                 += incremental
QMAKE_INCREMENTAL_STYLE = sublib

#define the architecture of arm/定义arm的架构
QT_QPA_PLATFORM = linuxfb:fb=/dev/fb0
QMAKE_CFLAGS_RELEASE += -O2 -march=armv7-a
QMAKE_CXXFLAGS_RELEASE += -O2 -march=armv7-a
#end

include(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)

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

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


这里我修改了两个地方,一是定义了arm的架构,其中:QT_QPA_PLATFORM是指定QPA平台的插件,这里选择的是linuxfb,参数-O是编译器提供的优化选项,如-O、-O1、-O2、-O3等,代表不同的优化级别,参数-march后面指定的是目标处理器的架构(可能指定不同的架构会调用不同的指令集,猜的~)。另外一个改动的地方就是将下面g++.conf和linux.conf中的参数值中加上了none,如arm-none-linux-gnueabi-gcc,这是我选择的交叉编译器,可以根据自身的情况修改。

2. 根据需求配置QT

配置QT可以通过源码包中configure脚本来完成,运行configure脚本后会得到makefile文件,然后通过make和make install命令完成编译和安装。这里我编写了一个脚本来实现配置的步骤。

! /bin/bash

echo "build Qt5 for embedded linux, Author: Lipengxiang"

mkdir Qt5.4.0_arm
cd Qt5.4.0_arm
mkdir Qt5.4.0_arm_install

/opt/qt-everywhere-opensource-src-5.4.0/configure \
-v \
-prefix /opt/Qt5.4.0_arm/Qt5.4.0_arm_install \
-release \
-make libs \
-xplatform linux-arm-gnueabi-g++ \
-optimized-qmake \
-pch \
-qt-sql-sqlite \
-qt-zlib \
-no-opengl \
-no-sse2 \
-no-openssl \
-no-nis \
-no-cups \
-no-glib \
-no-pkg-config \
-no-xcursor -no-xfixes -no-xrandr -no-xrender \
-no-separate-debug-info \
-nomake examples -nomake tools


从shell脚本中可以看到,参数-prefix指定了文件的安装路径,我的安装路径是/opt/Qt5.4.0_arm/Qt5.4.0_arm_install,参数-xplatform指定了目标平台为linux-arm-gnueabi-g++。执行这个脚本后就会得到makefile文件,下一步就可以进行编译了。

3. 编译和安装

终于可以编译了,执行make命令,然后开始漫长的编译过程,整个过程持续大概2个小时,I7处理器可能会快些~在make的过程中可能会出现报错,如:

***/qpaintervideosurface.cpp:99:47: error: incomplete type 'QOpenGLContext' used in nested name specifier




解决办法是将报错的cpp文件中包含’QOpenGLContext’的函数语句注释掉。网上说这个是5.4.0版本的bug,在5.4.1之后修复了。

解决了这个问题后就可以继续make了,一直到结束,然后就是激动人心的make install。到这里,QT的交叉编译就结束了。

移植所需的文件到ARM中

将编译安装得到的lib、plugins拷贝到开发板中,lib中存放的是QT程序运行所需的动态库文件,plugins中存放的应该是所需的插件。由于U盘挂载比较麻烦,这里选择使用scp命令,通过网络传输。

scp -r lib plugins root@192.168.1.119:/opt/Qt5.4.0_arm_install


其中root是开发板的用户名,192.168.1.119是其IP地址。

配置开发板环境并运行程序

在确保主机和开发板能互相ping通的情况下,通过ssh远程登录开发板。

ssh root@192.168.1.119


修改/etc/profile文件,设置开发板的环境变量,文件末尾添加的内容如下。

export LD_LIBRARY_PATH=/opt/Qt5.4.0_arm_install/lib
export QT_QPA_PLATFORM_PLUGIN_PATH=/opt/Qt5.4.0_arm_install/plugins
export QT_QPA_PLATFORM=linuxfb:fb=/dev/fb0
export QT_QPA_FONTDIR=/opt/Qt5.4.0_arm_install/lib/fonts


同样,使用source命令使其立即生效。

source /etc/profile


然后就可以尝试运行准备好的QT程序了,QT5中是不用加-qws参数的。至于如何通过QtCreator交叉编译ARM中的可执行程序,可以参考之前的文章。

到这里,所有的交叉编译和移植的过程就结束了。第一次使用markdown来写文章,感觉还挺好用的~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: