移植QT5.4.0到ARM开发板
2016-05-20 15:48
816 查看
QT5中不再用到QT4中的窗口系统qws++,而是使用QPA系统,二者之间的差异还不清楚,但是程序运行时不需要再加上参数-qws了。而这个特性也导致QT5与QT4的移植过程有一些区别,这里记录一下。
解压到某些路径下可能需要root权限,我的路径是/opt/qt-everywhere-opensource-src-5.4.0,这里的解压路径关联到后面QtCreator中Kits的路径配置。
这是我在/etc/profile文件末尾添加的内容,其中/opt/FriendlyARM/toolschain/4.5.1/bin是交叉编译器的路径。配置完成后使用命令
使得环境变量立即生效。配置完成后可以通过
查看交叉编译器的路径是否已经添加到系统环境变量PATH中。
可以查看交叉编译器的版本号:
如果能够正常显示出交叉编译器的版本号,则说明配置成功。
下面是我修改后的qmake.conf,其中的内容需要根据自己的实际情况去修改。
这里我修改了两个地方,一是定义了arm的架构,其中:QT_QPA_PLATFORM是指定QPA平台的插件,这里选择的是linuxfb,参数-O是编译器提供的优化选项,如-O、-O1、-O2、-O3等,代表不同的优化级别,参数-march后面指定的是目标处理器的架构(可能指定不同的架构会调用不同的指令集,猜的~)。另外一个改动的地方就是将下面g++.conf和linux.conf中的参数值中加上了none,如arm-none-linux-gnueabi-gcc,这是我选择的交叉编译器,可以根据自身的情况修改。
从shell脚本中可以看到,参数-prefix指定了文件的安装路径,我的安装路径是/opt/Qt5.4.0_arm/Qt5.4.0_arm_install,参数-xplatform指定了目标平台为linux-arm-gnueabi-g++。执行这个脚本后就会得到makefile文件,下一步就可以进行编译了。
解决办法是将报错的cpp文件中包含’QOpenGLContext’的函数语句注释掉。网上说这个是5.4.0版本的bug,在5.4.1之后修复了。
解决了这个问题后就可以继续make了,一直到结束,然后就是激动人心的make install。到这里,QT的交叉编译就结束了。
其中root是开发板的用户名,192.168.1.119是其IP地址。
修改/etc/profile文件,设置开发板的环境变量,文件末尾添加的内容如下。
同样,使用source命令使其立即生效。
然后就可以尝试运行准备好的QT程序了,QT5中是不用加-qws参数的。至于如何通过QtCreator交叉编译ARM中的可执行程序,可以参考之前的文章。
到这里,所有的交叉编译和移植的过程就结束了。第一次使用markdown来写文章,感觉还挺好用的~
准备工作
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来写文章,感觉还挺好用的~
相关文章推荐
- qt的容器类
- VS2008集成QT4.7.2环境搭建
- Qt 使用Windows API 函数精确控制循环执行的周期时间
- Qt编译遇到/usr/bin/ld: cannot find -lGL问题的解决方案
- 项目与软件推荐之编辑器-QOwnNotes
- Qt 获取当前时间
- 如何在QT中显示中文字符
- 指针操作:【申请】、【释放】、【YUV2BGR】、【QT保存图像】
- QT4的源代码在QT5的环境下编译
- Qt程序提示: 启动程序失败,路径或者权限错误解决方案
- QT-4.7.2的移植过程
- QT历届版本下载总汇
- Qt所有类型转换
- QT经典错误:/usr/include/qt4/QtCore/qatomic_i386.h:132: error: impossible constraint in 'asm'
- 异步消息传递技术的比较:JMS、AMQP和MQTT
- Qt控件及示例
- QT基本操作信号与槽
- Qt: test! test!
- QT类中keyPressEvent函数的重写
- 编译qt-arm版本的配置文件