从Windows到ARM Linux:Qt程序的交叉编译与移植指南

引言

在嵌入式开发中,我们经常需要将桌面端开发的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进行编译,则不需要配置交叉编译工具。

相关推荐
cdut_suye28 分钟前
全面剖析 Linux 进程管理与 PCB 机制
java·linux·运维·服务器·c++·人工智能·python
Chenyu_31036 分钟前
04.基于C++实现多线程TCP服务器与客户端通信
linux·服务器·网络·c++·tcp/ip·算法·visualstudio
mengzhi啊1 小时前
QTreeWidget的右键菜单,展开和折叠,或者其他操作
qt
___波子 Pro Max.2 小时前
ARM SVC指令
arm开发
十年编程老舅2 小时前
用Qt手搓AI助手,挑战24小时开发DeepSeek Assistant!
qt·计算机毕设·c++项目·qt项目·deepseek·计算机毕设项目
奔波霸的伶俐虫2 小时前
liunx磁盘挂载和jar启动命令
linux·运维·服务器
wwwlyj1233212 小时前
slab分配器(3):slab内存申请和释放
linux
march of Time2 小时前
go注册rpc接口
qt·rpc·golang
JiMoKuangXiangQu2 小时前
Linux 网络:skb 数据管理
linux·网络·skb
做程序员的第一天2 小时前
ubuntu下在pycharm中配置已有的虚拟环境
linux·ubuntu·pycharm