引言
在嵌入式开发中,我们经常需要将桌面端开发的Qt程序部署到ARM架构的Linux设备。本文详细介绍如何将Windows平台开发的Qt程序,通过Linux虚拟机交叉编译为ARM架构可执行文件的完整过程
环境准备
需要特别注意的是,对于CentOS 7 默认支持的GCC版本是4.8,这个版本对于Qt 6及以上的版本不支持。此外,使用Qt 5.15.2也需要升级GCC,注意QT版本。
开发环境
- 宿主机:Windows 11
- 虚拟机:Ubuntu 18.04 LTS(Vmware workstation运行)
- 目标设备:ARM64架构Linux
工具清单
工具 | 版本要求 | 作用 |
---|---|---|
Windows的Qt Creator | 5.15 | Windows端开发IDE |
Linux的Linaro工具链 | GCC 7.5+ | ARM交叉编译器 |
Linux的Qt源码包 | 5.15.2 | 交叉编译Qt库 |
完整操作流程
一、配置Linux交叉编译环境
1. 安装ARM64工具链
解释:这部分主要是下载ARM64的工具链,解压搭配/opt并且将这个路径添加到环境变量中,使得系统可以直接找到这个工具链。source ~/.bashrc设定环境变量的设置立刻生效。
wget https://releases.linaro.org/components/toolchain/binaries/latest-7/aarch64-linux-gnu/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz
sudo tar -xvf gcc-*.tar.xz -C /opt
echo 'export PATH=/opt/gcc-linaro-7.5.0/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
2. 验证工具链
aarch64-linux-gnu-gcc --version
二、交叉编译Qt库
1. 下载并解压Qt源码
解释:Linux版本的QT程序主要是为了适配ARM平台功能,提供跨平台API的ARM实现。
wget https://download.qt.io/archive/qt/5.15/5.15.2/single/qt-everywhere-src-5.15.2.tar.xz
tar xvf qt-everywhere-src-5.15.2.tar.xz
2. 配置编译参数
解释:这部分进入解压后Linux的QT目录。修改QT程序的配置:主要指定了安装路径,目标平台需要使用的编译器和工具链。并且禁用了opengl和xcb。
cd qt-everywhere-src-5.15.2
./configure -prefix /opt/qt5-arm -xplatform linux-aarch64-gnu-g++ -opensource -confirm-license -no-opengl -no-xcb
3. 编译安装
解释:解压后的QT还不能用,需要使用make编译成二进制的机器码,生成可执行文件、库文件。-j$(nproc)主要是自动读取处理器数量,加速编译。完成之后执行安装。
make -j$(nproc) && sudo make install
三、移植Qt项目
1. 修改.pro文件
解释:需要在我们编写的QT项目.pro文件处,添加以下代码用于指定ARM架构的交叉编译工具和Linux中QT程序的位置。
# ARM交叉编译配置
linux-aarch64-gnu-g++ {
QMAKE_CC = aarch64-linux-gnu-gcc
QMAKE_CXX = aarch64-linux-gnu-g++
# 指定Qt库路径
QT_INSTALL_PREFIX = /opt/qt5-arm
QMAKE_LIBDIR_QT = $$QT_INSTALL_PREFIX/lib
QMAKE_INCDIR_QT = $$QT_INSTALL_PREFIX/include
# 优化参数
QMAKE_CFLAGS += -march=armv8-a -mtune=cortex-a72
QMAKE_CXXFLAGS += $$QMAKE_CFLAGS
}
2. 生成Makefile
/opt/qt5-arm/bin/qmake -spec linux-aarch64-gnu-g++
3. 执行编译
make clean && make -j4
之后这样生成的文件便可以在arm架构的Linux上运行了。
四、部署
在部署到目标平台(arm架构的Linux)后执行以下命令,进行图形库安装,为程序添加执行权限以及执行程序。(注意,查看当前目录下有没有你的执行程序,程序名字也不需要加"")
# 安装运行时依赖
sudo apt install libqt5core5a libqt5gui5
# 运行程序
chmod +x "your appliction"
./"your appliction" -platform linuxfb # 无GUI设备使用帧缓冲模式
值得一提的是,如果目标设备的屏幕已经被一个程序占据导致你的程序无法显示。
可以先使用ps -elf | grep 程序名字 找到进程,再使用kill 结束进程。之后在运行进程。
一些额外说明:
1.交叉编译:与编译不同点在于,交叉编译出来的程序无法在执行编译的环境运行,比如刚刚的Linux上使用arm的交叉编译工具链编译出来的程序就无法运行,必须要在arm架构的Linux才能运行。
2.QT的跨平台是指一份源码,在编译后可以在多个平台运行。而不是一份源码在多个平台直接运行。因此Windows程序即使向同架构的Linux操作系统移植QT,也需要使用源码在Linux编译一次。
3.配置交叉工具的原因:即使是Windows上面,也有一个编译工具,默认为x86/x64的机器码。当要在不同架构运行QT的时候,需要显示指定编译工具,比如arm架构运行的交叉编译工具。
容易混淆的点:一般来说,如果在Windows编译同架构的Linux程序,同样需要交叉编译工具。但如果只是在Windows编写源码,在Linux进行编译,则不需要配置交叉编译工具。