1. 环境准备搭建交叉编译基础环境第一次接触嵌入式Qt开发时我对着全志H5开发板发愁——官方资料只支持Qt4.8而现代项目需要Qt5的新特性。经过多次尝试最终在Ubuntu 20.04上成功完成了Qt5.12.11的交叉编译。整个过程就像搭积木缺一块都不行。硬件选择方面NanoPi K1 Plus是个不错的起点。它采用四核Cortex-A53架构支持aarch64指令集性能足够运行Qt应用。实测发现开发板的eMMC存储速度比SD卡快30%左右建议优先使用。软件准备清单Qt源码包推荐清华镜像站的qt-everywhere-src-5.12.11.tar.xz交叉编译器Linaro 6.3.1版本gcc-linaro-6.3.1-2017.02-x86_64_aarch64-linux-gnu虚拟机环境Ubuntu 20.04 LTS桌面版更友好安装交叉编译器时有个小技巧不要直接解压到/usr/local先在用户目录创建arm-toolchain文件夹。这样做的好处是权限管理更简单重装系统时也方便备份。我通常这样配置环境变量export PATH$PATH:/home/yourname/arm-toolchain/bin验证编译器是否生效时别只看aarch64-linux-gnu-gcc -v的输出。我遇到过能显示版本但实际编译失败的情况建议用简单的hello world程序测试// test.c #include stdio.h int main() { printf(Cross-compile test\n); return 0; }编译命令aarch64-linux-gnu-gcc test.c -o test如果生成的可执行文件用file test查看显示为ELF 64-bit LSB executable, ARM aarch64说明工具链真的准备好了。2. 源码配置定制化Qt构建参数解压Qt源码后别急着配置先处理一个关键环节——修改qmake配置。很多教程直接让改linux-aarch64-gnu-g目录下的文件但我建议先复制一份cd qtbase/mkspecs cp -r linux-aarch64-gnu-g aarch64-custom这样原始配置得以保留出了问题可以快速回滚。修改aarch64-custom/qmake.conf时重点注意这些参数QMAKE_CC /path/to/your/aarch64-linux-gnu-gcc QMAKE_CXX /path/to/your/aarch64-linux-gnu-g QMAKE_LINK $QMAKE_CXX # 必须与C编译器一致有个坑我踩过三次路径中的横线(-)和下划线(_)要严格匹配。比如工具链路径是aarch64-linux-gnu但qmake里写成aarch64_linux_gnu就会导致编译失败。配置脚本建议用autoconfigure.sh管理分享我的配置模板#!/bin/bash ./configure \ -prefix /opt/qt5-arm \ -opensource -confirm-license \ -xplatform aarch64-custom \ # 对应修改后的mkspecs目录名 -no-opengl -linuxfb \ # 无GPU时必备 -qt-zlib -qt-libpng \ # 减少外部依赖 -skip qtwebengine \ # 最耗时的模块 -nomake examples # 首次编译可跳过示例特别注意-xplatform参数必须与自定义的mkspecs目录名完全一致。曾经因为少写一个字母浪费了两小时排查时间。3. 编译优化加速构建的技巧执行make前先调整系统设置能显著提升效率。我的Ubuntu虚拟机配置经验分配至少8GB内存Qt编译很吃内存设置16GB交换空间物理内存不足时救命CPU核心数选实际物理核心数超线程可能适得其反编译命令推荐这样写time (make -j$(nproc) 21 | tee build.log)这行命令做了三件事$(nproc)自动获取CPU核心数21 | tee同时输出到屏幕和日志文件time记录总编译时长遇到编译失败时别急着从头开始。先检查build.log的最后100行tail -n 100 build.log | grep -i error常见错误解决方案内存不足添加-j4降低并行度依赖缺失执行sudo apt build-dep qt5-default权限问题确保整个Qt源码目录属主是当前用户编译完成后install阶段也要注意make install INSTALL_ROOT/target/path这样可以把所有文件打包到指定目录方便后续部署到开发板。4. 部署实战开发板环境配置将编译好的Qt库移植到开发板时我强烈建议使用NFS挂载先测试。具体步骤在Ubuntu主机配置NFS共享sudo apt install nfs-kernel-server echo /opt/qt5-arm *(rw,sync,no_subtree_check) | sudo tee -a /etc/exports sudo service nfs-kernel-server restart开发板挂载mount -t nfs 192.168.x.x:/opt/qt5-arm /mnt/qt环境变量配置有个易错点开发板的/etc/profile可能被覆盖。更稳妥的做法是在用户目录的.bashrc中添加export QT_ROOT/mnt/qt export QT_QPA_PLATFORMlinuxfb:fb/dev/fb0 export LD_LIBRARY_PATH$QT_ROOT/lib:$LD_LIBRARY_PATH测试时先运行最简单的示例$QT_ROOT/examples/widgets/analogclock/analogclock如果出现以下问题黑屏无显示检查fb设备节点权限字体缺失拷贝PC的/usr/share/fonts到开发板库找不到用ldd检查可执行文件的依赖最后提醒正式部署时记得strip二进制文件我的H5开发板上的Qt应用体积因此减小了40%aarch64-linux-gnu-strip your_app