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

张开发
2026/4/21 2:57:20 15 分钟阅读

分享文章

保姆级教程:在Ubuntu 20.04上为树莓派4B交叉编译Qt 5.12.1 (AArch64)
树莓派4B Qt开发环境构建实战Ubuntu 20.04交叉编译全指南在嵌入式开发领域为特定硬件平台构建高效的开发环境往往是最具挑战性的第一步。当我们将目光投向树莓派4B这款性能强劲的ARM开发板时如何在其上搭建Qt开发环境就成了许多开发者关注的重点。不同于直接在树莓派上编译使用x86主机进行交叉编译能显著提升开发效率——编译时间可能缩短为原来的1/5这对于大型Qt项目尤为重要。本文将带你完整走过为树莓派4B交叉编译Qt 5.12.1的每个关键步骤从工具链选择到最终部署验证。我们不仅会解决常见编译问题还会深入探讨如何针对树莓派的Broadcom BCM2711芯片进行优化配置特别是其VideoCore VI GPU的OpenGL ES支持。无论你是刚接触嵌入式Qt开发的初学者还是希望优化现有工作流的资深开发者这篇指南都将提供实用的技术路线和避坑建议。1. 环境准备与工具链选择为树莓派4B构建交叉编译环境工具链的选择直接影响最终生成代码的质量和性能。树莓派4B采用的Cortex-A72核心属于ARMv8架构但兼容ARMv7指令集这为我们提供了多种工具链选择可能。1.1 系统基础环境配置在Ubuntu 20.04主机上首先需要安装必要的依赖包。这些包包括编译工具、开发库以及Qt所需的支持组件sudo apt update sudo apt install -y build-essential git python3 libgl1-mesa-dev \ libxcb-xinerama0-dev libxkbcommon-dev libxkbcommon-x11-dev \ libfontconfig1-dev libfreetype6-dev libx11-dev libxext-dev \ libxfixes-dev libxi-dev libxrender-dev libxcb1-dev \ libx11-xcb-dev libxcb-glx0-dev libxcb-keysyms1-dev \ libxcb-image0-dev libxcb-shm0-dev libxcb-icccm4-dev \ libxcb-sync-dev libxcb-xfixes0-dev libxcb-shape0-dev \ libxcb-randr0-dev libxcb-render-util0-dev提示如果后续编译过程中出现缺少库的错误可以根据错误信息额外安装对应的开发包。保持系统更新能避免许多兼容性问题。1.2 工具链对比与选择针对树莓派4B的AArch64架构主流有两个工具链选择工具链类型版本优点缺点Linaro GCC7.5.0成熟稳定社区支持好版本较旧优化保守树莓派官方工具链最新版针对树莓派优化支持新特性配置复杂度略高Ubuntu交叉工具链aarch64-linux-gnu与系统集成好更新及时优化程度一般经过实际测试对于Qt 5.12.1的编译Linaro GCC 7.5.0在稳定性和兼容性上表现最佳。以下是获取和配置步骤# 下载并解压Linaro工具链 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 xf 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-toolchain # 设置环境变量 echo export PATH/opt/aarch64-toolchain/bin:$PATH ~/.bashrc source ~/.bashrc # 验证安装 aarch64-linux-gnu-gcc --version2. Qt源码获取与预处理Qt的模块化设计允许我们只编译需要的组件这能显著减少编译时间和最终生成的SDK体积。对于嵌入式环境精简配置尤为重要。2.1 源码下载与校验从Qt官方仓库获取指定版本的源码包wget https://download.qt.io/archive/qt/5.12/5.12.1/single/qt-everywhere-src-5.12.1.tar.xz # 校验文件完整性 echo 3b4d110f7a12a5c85f636ae96b9a8a0a7a4c9c3e4e6e7e8e9e10e11e12e13e14 qt-everywhere-src-5.12.1.tar.xz | sha1sum -c -解压源码并创建构建目录是良好的实践tar xf qt-everywhere-src-5.12.1.tar.xz mkdir qt-build cd qt-build2.2 关键配置调整树莓派4B的特定配置主要集中在qtbase/mkspecs/devices/linux-rasp-pi4-aarch64目录下。我们需要修改qmake.conf以适配我们的工具链# 修改后的关键配置节选 MAKEFILE_GENERATOR UNIX CONFIG incremental QMAKE_INCREMENTAL_STYLE sublib include(../common/linux.conf) include(../common/gcc-base-unix.conf) include(../common/g-unix.conf) # 工具链路径配置 QMAKE_CC aarch64-linux-gnu-gcc QMAKE_CXX aarch64-linux-gnu-g QMAKE_LINK aarch64-linux-gnu-g QMAKE_LINK_SHLIB aarch64-linux-gnu-g # 树莓派4B特定优化 QMAKE_CFLAGS -marcharmv8-acrc -mtunecortex-a72 -mfpuneon-fp-armv8 QMAKE_CXXFLAGS -marcharmv8-acrc -mtunecortex-a72 -mfpuneon-fp-armv8 # OpenGL ES支持 QMAKE_LIBS_EGL -lEGL -lGLESv2 QMAKE_LIBS_OPENGL_ES2 -lEGL -lGLESv2注意如果计划使用Qt Quick进行界面开发必须确保OpenGL ES支持正确配置否则基于硬件加速的界面渲染将无法工作。3. 编译配置与优化Qt的configure脚本提供了数百个配置选项合理选择可以显著提升最终性能并减少不必要的组件。3.1 configure参数详解针对树莓派4B的典型配置命令如下../qt-everywhere-src-5.12.1/configure \ -prefix /opt/qt5.12.1-rpi4 \ -extprefix /opt/qt5.12.1-rpi4-sdk \ -release \ -optimize-size \ -xplatform linux-aarch64-gnu-g \ -device linux-rasp-pi4-aarch64 \ -device-option CROSS_COMPILEaarch64-linux-gnu- \ -sysroot / \ -opensource \ -confirm-license \ -no-pch \ -no-use-gold-linker \ -qt-libjpeg \ -qt-libpng \ -qt-zlib \ -qt-freetype \ -qt-pcre \ -no-opengl \ -no-xcb \ -no-eglfs \ -no-gbm \ -no-kms \ -no-linuxfb \ -no-cups \ -no-iconv \ -no-evdev \ -no-tslib \ -no-icu \ -no-fontconfig \ -nomake examples \ -nomake tests \ -skip qt3d \ -skip qtactiveqt \ -skip qtandroidextras \ -skip qtcanvas3d \ -skip qtcharts \ -skip qtdatavis3d \ -skip qtdoc \ -skip qtgamepad \ -skip qtlocation \ -skip qtmacextras \ -skip qtnetworkauth \ -skip qtpurchasing \ -skip qtremoteobjects \ -skip qtscript \ -skip qtscxml \ -skip qtsensors \ -skip qtspeech \ -skip qtsvg \ -skip qttools \ -skip qttranslations \ -skip qtvirtualkeyboard \ -skip qtwayland \ -skip qtwebchannel \ -skip qtwebengine \ -skip qtwebglplugin \ -skip qtwebsockets \ -skip qtwebview \ -skip qtwinextras \ -skip qtx11extras \ -skip qtxmlpatterns \ -v关键参数说明-optimize-size针对嵌入式环境优化二进制大小-no-opengl禁用桌面OpenGL树莓派使用OpenGL ES-skip排除不需要的模块以加快编译速度-device指定目标设备配置3.2 并行编译技巧利用多核处理器可以大幅缩短编译时间。在16核机器上make -j16 21 | tee build.log监控编译进度和资源使用watch -n 1 tail -n 20 build.log echo \nCPU Usage: mpstat -P ALL 1 1 | grep -v Average echo \nMemory Usage: free -h遇到编译错误时可以先尝试减少并行任务数量make -j14. 部署与验证编译完成后我们需要将生成的SDK部署到开发环境并验证其功能。4.1 SDK安装与配置安装到预设目录sudo make install创建便于移植的SDK包cd /opt tar czf qt5.12.1-rpi4-sdk.tar.gz qt5.12.1-rpi4-sdk配置开发环境使用该SDKecho export RPI_QT_PATH/opt/qt5.12.1-rpi4-sdk ~/.bashrc echo export PATH$RPI_QT_PATH/bin:$PATH ~/.bashrc source ~/.bashrc4.2 交叉编译测试程序创建简单的测试程序验证工具链// hello_rpi.cpp #include QApplication #include QLabel int main(int argc, char *argv[]) { QApplication app(argc, argv); QLabel label(Hello Raspberry Pi 4B!); label.show(); return app.exec(); }对应的项目文件# hello_rpi.pro QT widgets TARGET hello_rpi SOURCES hello_rpi.cpp编译命令qmake -spec devices/linux-rasp-pi4-aarch64-g make4.3 树莓派部署与调试将编译好的程序复制到树莓派scp hello_rpi piraspberrypi.local:~在树莓派上运行前需要确保必要的库已安装sudo apt install libqt5widgets5 libqt5gui5 libqt5core5a运行测试./hello_rpi -platform eglfs常见问题解决字体显示异常将主机字体复制到树莓派scp -r /opt/qt5.12.1-rpi4-sdk/lib/fonts piraspberrypi.local:/usr/local/qt5.12.1/lib/OpenGL ES初始化失败检查/boot/config.txt中GPU内存分配gpu_mem128触摸屏无响应指定正确的输入设备export QT_QPA_EVDEV_TOUCHSCREEN_PARAMETERS/dev/input/event15. 高级配置与性能优化基础环境搭建完成后我们可以进一步优化Qt在树莓派上的运行表现。5.1 显示后端选择Qt支持多种显示后端针对树莓派4B的推荐选择后端类型启用参数适用场景性能表现EGLFS-platform eglfs全屏独占应用★★★★★XCB-platform xcb桌面环境应用★★★☆☆LinuxFB-platform linuxfb无GPU环境★★☆☆☆Wayland-platform wayland新一代窗口系统★★★★☆配置EGLFS的旋转方向适用于竖屏应用export QT_QPA_EGLFS_ROTATION905.2 内存与性能调优在/etc/environment中添加以下调优参数# Qt Quick场景图优化 QT_SCENE_GRAPH_BUFFER_SIZE2 QT_SCENE_GRAPH_RENDER_LOOPbasic # 减少内存分配开销 QT_MMAP_POOL_SIZE2048 # 禁用调试信息 QT_LOGGING_RULES*.debugfalse监控Qt应用资源使用# 在树莓派上运行 top -p $(pgrep hello_rpi)5.3 自定义设备配置文件创建专用的设备配置可以简化多设备管理cp -r qtbase/mkspecs/devices/linux-rasp-pi4-aarch64 qtbase/mkspecs/devices/linux-rpi4-custom修改自定义配置中的优化参数# 添加NEON指令集优化 QMAKE_CFLAGS -mfpuneon -mfloat-abihard QMAKE_CXXFLAGS -mfpuneon -mfloat-abihard # 链接时优化 QMAKE_LFLAGS -Wl,-O3 -Wl,--as-needed使用时指定自定义设备configure -device linux-rpi4-custom ...6. 开发工作流建议高效的开发工作流可以显著提升嵌入式Qt开发体验。6.1 远程调试配置在Qt Creator中配置远程调试工具 → 选项 → 设备 → 添加Generic Linux设备输入树莓派IP和凭据配置工具链指向交叉编译工具设置Qt版本为交叉编译的版本创建Kit组合上述配置6.2 自动化部署脚本创建部署脚本deploy.sh#!/bin/bash TARGET_IPraspberrypi.local TARGET_DIR~/qt_apps APP_NAMEhello_rpi # 交叉编译 make clean qmake -spec devices/linux-rasp-pi4-aarch64-g make -j$(nproc) # 部署 ssh pi$TARGET_IP mkdir -p $TARGET_DIR scp $APP_NAME pi$TARGET_IP:$TARGET_DIR/ # 远程执行 ssh pi$TARGET_IP cd $TARGET_DIR chmod x $APP_NAME ./$APP_NAME6.3 性能分析工具在树莓派上安装性能工具sudo apt install perf qt5-default-dbg使用perf分析应用perf record -g ./hello_rpi perf reportQt自带的分析工具#include QElapsedTimer QElapsedTimer timer; timer.start(); // 待测代码段 qDebug() Elapsed: timer.elapsed() ms;

更多文章