news 2026/4/20 19:35:17

保姆级教程:在Ubuntu 20.04上为树莓派4B交叉编译Qt 5.12.1 (ARM64/AArch64)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
保姆级教程:在Ubuntu 20.04上为树莓派4B交叉编译Qt 5.12.1 (ARM64/AArch64)

树莓派4B Qt 5.12.1交叉编译实战指南:从Ubuntu环境搭建到ARM64部署

在嵌入式开发领域,树莓派4B凭借其强大的ARM Cortex-A72四核处理器和丰富的GPIO接口,已成为物联网和边缘计算项目的首选硬件平台。而Qt框架的跨平台特性与丰富的GUI组件库,使其成为树莓派应用开发的黄金组合。本文将手把手带你完成在Ubuntu 20.04系统上为树莓派4B交叉编译Qt 5.12.1的全过程,解决ARM64架构下的开发环境搭建难题。

1. 交叉编译环境准备

1.1 工具链选择与安装

针对树莓派4B的ARM64架构,我们选择Linaro GCC 7.5.0作为基础工具链。这个经过优化的编译器套件专为ARM处理器设计,能充分发挥A72架构的性能优势。首先在Ubuntu终端执行以下命令获取工具链:

wget https://releases.linaro.org/components/toolchain/binaries/7.5-2019.12/aarch64-linux-gnu/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz

解压并安装到系统目录:

tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz sudo mv gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu /opt/aarch64-linux-gnu-7.5.0

提示:建议将工具链安装在/opt目录下,便于多用户共享使用且不会因系统升级被覆盖

1.2 环境变量配置

永久生效的环境变量配置需要编辑bashrc文件:

sudo nano /etc/bash.bashrc

在文件末尾添加以下内容:

# AArch64交叉编译器路径 export PATH=$PATH:/opt/aarch64-linux-gnu-7.5.0/bin export CROSS_COMPILE=aarch64-linux-gnu-

验证安装是否成功:

aarch64-linux-gnu-gcc -v

正常输出应显示类似信息:

Target: aarch64-linux-gnu Thread model: posix gcc version 7.5.0 (Linaro GCC 7.5-2019.12)

2. Qt源码定制化配置

2.1 源码获取与目录结构

从Qt官方仓库下载5.12.1版本源码:

wget https://download.qt.io/archive/qt/5.12/5.12.1/single/qt-everywhere-src-5.12.1.tar.xz tar -xvf qt-everywhere-src-5.12.1.tar.xz

创建目标安装目录:

sudo mkdir -p /opt/qt-5.12.1-rpi4 sudo chown $USER:$USER /opt/qt-5.12.1-rpi4

2.2 关键配置文件修改

进入qtbase/mkspecs/linux-aarch64-gnu-g++目录,编辑qmake.conf文件:

# 编译器路径配置 QMAKE_CC = $${CROSS_COMPILE}gcc QMAKE_CXX = $${CROSS_COMPILE}g++ QMAKE_LINK = $${CROSS_COMPILE}g++ # 工具链配置 QMAKE_AR = $${CROSS_COMPILE}ar cqs QMAKE_OBJCOPY = $${CROSS_COMPILE}objcopy QMAKE_STRIP = $${CROSS_COMPILE}strip # 树莓派4B特定优化 QMAKE_CFLAGS += -march=armv8-a+crc -mtune=cortex-a72 QMAKE_CXXFLAGS += $$QMAKE_CFLAGS

针对树莓派的特性,建议启用以下模块:

  • OpenGL ES:树莓派4B的VideoCore VI GPU支持
  • eglfs:嵌入式平台专用显示插件
  • tslib:触摸屏支持

3. 编译配置与优化

3.1 configure参数详解

执行configure时的关键参数组合:

./configure -prefix /opt/qt-5.12.1-rpi4 \ -xplatform linux-aarch64-gnu-g++ \ -release \ -opensource -confirm-license \ -opengl es2 \ -eglfs \ -no-xcb \ -no-pch \ -qt-libjpeg \ -qt-libpng \ -qt-zlib \ -skip qtvirtualkeyboard \ -skip qtwebengine \ -nomake examples \ -nomake tests

参数说明表:

参数作用树莓派适配建议
-opengl es2启用OpenGL ES 2.0必须启用
-eglfs嵌入式图形系统推荐启用
-no-xcb禁用X11后端节省编译时间
-skip qtwebengine跳过Chromium内核显著减少体积
-no-pch禁用预编译头避免内存不足错误

3.2 并行编译技巧

使用make的-j参数可大幅提升编译速度:

make -j$(nproc) 2>&1 | tee build.log

注意:树莓派4B的交叉编译建议保留至少2GB内存空间,若遇到内存不足可尝试减少并行任务数

常见问题处理:

  • GL库缺失:安装libgl1-mesa-dev
  • 字体配置错误:预装libfontconfig1-dev
  • EGL报错:检查libegl1-mesa-dev是否安装

4. 部署与测试验证

4.1 目标系统准备

在树莓派4B上需预先安装运行时依赖:

sudo apt install libgles2-mesa libegl1-mesa \ libxkbcommon-dev libts-dev \ libinput-dev libudev-dev

4.2 Qt库部署方案

将编译好的Qt库打包传输到树莓派:

tar -czf qt-5.12.1-rpi4.tar.gz /opt/qt-5.12.1-rpi4 scp qt-5.12.1-rpi4.tar.gz pi@raspberrypi.local:/home/pi

在树莓派上解压并设置环境变量:

sudo tar -xzf qt-5.12.1-rpi4.tar.gz -C /usr/local echo "export QT_DIR=/usr/local/qt-5.12.1-rpi4" >> ~/.bashrc echo "export PATH=$QT_DIR/bin:$PATH" >> ~/.bashrc

4.3 交叉编译示例项目

在开发机上创建简单的QWidget应用,使用qmake生成Makefile:

qmake -spec linux-aarch64-gnu-g++ CONFIG+=release make

将生成的可执行文件传输到树莓派运行:

scp hello_rpi pi@raspberrypi.local:/home/pi ssh pi@raspberrypi.local "./hello_rpi -platform eglfs"

性能优化技巧:

  • 使用-platform eglfs参数跳过X11服务
  • 启用QT_LOGGING_RULES=qt.qpa.*=false减少日志输出
  • 设置QT_QPA_EGLFS_FORCE888=1强制32位色深

5. 高级配置与调试

5.1 触摸屏校准

对于嵌入式触摸设备,需要配置tslib:

export TSLIB_CONSOLEDEVICE=none export TSLIB_FBDEVICE=/dev/fb0 export TSLIB_TSDEVICE=/dev/input/touchscreen0 export TSLIB_CALIBFILE=/etc/pointercal export TSLIB_CONFFILE=/etc/ts.conf export TSLIB_PLUGINDIR=/usr/lib/ts

在Qt启动参数中添加:

-platform eglfs -plugin tslib:/dev/input/touchscreen0

5.2 性能监控工具

使用vcdbg分析GPU使用情况:

vcdbg reloc | grep mem_arm

内存占用检查命令:

vcgencmd get_mem arm && vcgencmd get_mem gpu

Qt应用性能统计:

export QT_LOGGING_RULES="qt.qpa.*=true" ./your_app -platform eglfs 2>&1 | grep "frame"

6. 常见问题解决方案

6.1 编译错误排查

问题1:undefined reference to `glXXX'

sudo apt install libgles2-mesa-dev

问题2:EGL无法初始化检查树莓派config.txt配置:

dtoverlay=vc4-fkms-v3d gpu_mem=256

6.2 运行时问题

黑屏无输出

  • 确认使用-platform eglfs参数
  • 检查用户是否拥有video组权限

触摸屏无响应

export QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS=/dev/input/event0:rotate=0

字体显示异常

cp /usr/share/fonts/truetype/dejavu/DejaVuSans.ttf /usr/local/qt-5.12.1-rpi4/lib/fonts/

在完成所有步骤后,建议创建一个自动化部署脚本,包含以下功能:

  • 自动检测交叉编译器版本
  • 下载并验证Qt源码完整性
  • 根据树莓派型号自动优化编译参数
  • 生成部署包并附带版本信息
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/20 19:35:09

告别卡顿!用H.266/VVC的IBC技术优化你的远程桌面和游戏串流

告别卡顿!用H.266/VVC的IBC技术优化你的远程桌面和游戏串流 远程协作和云游戏正成为数字生活的新常态,但画面撕裂、延迟卡顿始终是用户体验的"阿喀琉斯之踵"。当你在视频会议中共享PPT时,那些不断闪烁的鼠标轨迹;或是用…

作者头像 李华
网站建设 2026/4/20 19:29:15

AT32定时器外部脉冲计数实战:从引脚冲突到定时器方案选型

1. 当引脚中断遇上硬件限制:为什么传统方案行不通 第一次接触AT32定时器外部脉冲计数时,我和大多数开发者一样,首先想到的是最直接的引脚中断方案。毕竟在STM32等常见MCU上,用外部中断计数是最容易上手的方案。但当我尝试在AT32F4…

作者头像 李华