前言
搞嵌入式难免和arm开发板打交道,普通源文件可以通过PC上配置交叉编译器编译成ARM架构的可执行文件直接下载到开发板上运行,这是一般的操作。倘若要用到QT的工程文件来编译,这时候pc上的QT版本就不支持了,因为pc版是x86_64架构,两者不能兼容。而如果开发板不支持本地安装qt,我们就要自己编译一个嵌入式linux且支持arm架构的qt版本,以满足我们在开发板上跑qt程序的需要.
本文使用的开发板是树莓派(raspberrypi)3代B型,核心是arm公司的Cortex-A53,方法在其他arm开发板适用。
1、准备工作
保证电脑有安装qt,如若没有,可以下载这里的安装包安装(64位),下载地址:
链接:
https://pan.baidu.com/s/1nvl6oeH 密码: g7uj
下载之后,在终端用命令给其执行权限,注意切换到管理员用户(root):
#chmod 0755 qt-opensource-linux-x64-5.9.1.run
然后鼠标双击运行即可,之后就按照提示安装完成。
2、配置交叉编译器
注意,建议事先了解开发板系统所自带的交叉编译器,防止版本不适配带来的问题。配置的交叉编译器和编译QT的编译器最好一致,否则可能出错。比如,本项目采用的是树莓派自带的arm-linux-gnueabihf-gcc/g++的编译器,那么整个过程的编译都是用此编译器,这样保证编译的文件环境属性和开发板的运行环境一致,出错可能性较小。
这里有几个版本可供下载,是否支持取决于板上的系统
arm-linux-gcc :实际上是arm-linux-gnueabi-gcc ,大多数linux系统版本支持
arm-linux-gnueabihf-gcc: 树莓派自带编译器,本项目使用
aarch64-linux-gnu-gcc : 针对Arch linux 系统版本
下载地址:
链接:
https://pan.baidu.com/s/1i5KQVkD 密码: wwia
解压
#tar -zvxf gcc-linaro-arm-linux-gnueabihf-4.9-2014.07_linux.tar.gz
后得到目录gcc-linaro-arm-linux-gnueabihf-4.9-2014.07_linux
在root用户下配置环境变量,编辑.bashrc文件
#vim /root/.bashrc
在里面添加一行
export PATH=/解压的路径/gcc-linaro-arm-linux-gnueabihf-4.9-2014.07_linux/bin:$PATH
然后按esc,输入:wq保存退出,重新打开终端生效。
输入arm-,然后按几下tab,如果有出现一堆编译器就表示配置成功
3、编译嵌入式linux的QT版本
这次用到的版本是qt-everywhere-opensource,一个适用于嵌入式linux的版本,而这个版本没有二进制版本,只能靠我们自己编译。
源码下载地址:
链接:
https://pan.baidu.com/s/1pLFUt9T 密码: 9avn
解压
#tar -zxvf qt-everywhere-opensource-src-4.8.6.tar.gz
进入qt-everywhere-opensource-src-4.8.6目录,更改mkspecs目录下linux-arm-gnueabi-g++目录名为linux-arm-gnueabihf-g++
#cd qt-everywhere-opensource-src-4.8.6/
#mv mkspecs/linux-arm-gnueabi-g++ mkspecs/linux-arm-gnueabihf-g++
编辑qmake.config文件
#vim mkspecs/linux-arm-gnueabihf-g++/qmake.conf
修改原来的交叉编译器换成本项目使用的编译器,结果如下:
MAKEFILE_GENERATOR = UNIX
TARGET_PLATFORM = unix
TEMPLATE = app
CONFIG += qt warn_on release incremental link_prl gdb_dwarf _index
QT += core gui
QMAKE_INCREMENTAL_STYLE = sublib
include(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)
QMAKE_CC = arm-linux-gnueabihf-gcc
QMAKE_CXX = arm-linux-gnueabihf-g++
QMAKE_LINK = arm-linux-gnueabihf-g++
QMAKE_LINK_SHLIB = arm-linux-gnueabihf-g++
QMAKE_AR = arm-linux-gnueabihf-ar cqs
QMAKE_OBJCOPY = arm-linux-gnueabihf-objcopy
QMAKE_STRIP = arm-linux-gnueabihf-strip
load(qt_config)
然后保存退出。
编译前安装所需要的32位库:
#yum install glibc.i686 libstdc++.i686 zlib.i686
#yum install mesa*.i686
完成后,在终端执行如下命令,进行编译前的环境配置和检查:
./configure -prefix /opt/Qt-4.8.6 -embedded arm -xplatform linux-arm-gnueabihf-g++ -depths 16,24,32 -little-endian -no-mmx -no-3dnow -no-sse -no-sse2 -no-glib -no-cups -no-largefile -no-accessibility -no-openssl -no-gtkstyle -qt-freetype -qt-mouse-pc -qt-mouse-linuxtp -qt-mouse-linuxinput -plugin-mouse-pc -fast -qt-gfx-transformed -opensource -confirm-license
其中,-prefix 后面是指定编译后的安装目录/opt/Qt-4.8.6,-xplatform 后指定交叉编译器linux-arm-gnueabihf-g++,其余选项可以不变
检查完成后,会提示 you just to run “gmake”…等等英文
接下来开始编译安装
#gmake
过程大概几个小时,耐心等待…
编译完成后,安装:
#gmake install
安装完成后,在/opt下就可以看到Qt-4.8.6目录,编译安装成功。
4、配置QT
1)配置交叉编译器
打开PC版本的QT,菜单栏 工具 -> 选项, 选择 “构建和运行”,
接下来配置刚才编译的交叉编译器,gcc和g++的交叉编译版本
点击 “编译器”,选择“Manual”,在右边点击“添加”按钮,选择GCC->C,
名称可命名为ARMGCC,点击浏览,找到编译器目录下的bin目录,选择
arm-linux-gnueabihf-gcc,点击open,然后点击Apply
同理,在右边点击“添加”按钮,选择GCC->C++,
名称可命名为ARMG++,点击浏览,找到编译器目录下的bin目录,选择
arm-linux-gnueabihf-g++,点击open,然后点击Apply
配置结果如图:
点击OK
2)配置qt嵌入式linux版本
回到“构建和运行”,选择Qt Versions,选择手动设置,右边点击“添加”,找到/opt/Qt-4.8.6/bin/qmake,也就是安装后qmake的目录,点击open
点击Apply,效果如图:
点击 OK 。
3)增加套件
回到 构建和运行,点击“构建套件”,选择手动设置,右边点击添加,
配置如图:
备注:sysroot 可以不用添加
点击Apply,然后点击OK,这样qt的环境就配置好了
现在可以试试新建一个工程文件,编译一个hellowindow,
套件要选择arm!亲测是可以通过的
4)复制相关的QT库
将 /opt/Qt-4.8.6/lib/ 下的所有动态链接库文件复制到板上的 /usr/lib/ 下,
这样确保库文件不会找不到
最后,将编译后的可执行文件拷到板上,在板上执行,要加-qws参数
#./可执行文件名 -qws
成功运行,大功告成!