资讯动态

ARM64 Linux 安装 Qt 与 QtCreator 工具链实战

发布时间:2026/10/1 19:07:23 来源:尧图企业网站定制
上周同事把一台 ARM64 工作站推到我桌上麒麟 V10 桌面版机器是新配的任务很朴素把 Qt 编译器和 QtCreator 装起来能编译、能跑界面程序就行。结果我在上面耗掉了差不多一整天——网上能搜到的qt安装教程九成是 x86_64 的qtcreator 下载页那个 .run 文件拷过来直接报cannot execute binary file仓库里装的版本又老得让人心里发虚。后来我把三条可行路线都走了一遍从 apt 一把梭到源码全量编译中间踩的坑足够写一篇完整的记录。这篇就把 ARM64 环境下装 Qt 工具链和 QtCreator 的完整过程摊开讲包括每一条路线的适用边界、必须装的依赖、Kit 怎么配、以及那些文档里不会写的报错怎么定位。只要你能登进一台 ARM64 的 LinuxUbuntu arm64、麒麟 V10、树莓派 64 位系统都算跟着走就能把环境落地。1. ARM64 装 Qt 之前先把装什么这件事捋清楚我见过太多人卡在第一步把装 Qt理解成装一个叫 Qt 的软件。实际上在 ARM64 上这件事至少包含三个互相独立的部分——编译器工具链、Qt 库本体、以及 QtCreator 这个 IDE。三者可以分别来自不同地方版本也不必完全一致但配错了就会出现IDE 装好了却编不出程序这种典型症状。1.1 QtCreator 只是壳真正干活的是 gcc 那一套QtCreator 本质是一个用 Qt 自己写的编辑器加调试前端它自己不产生任何机器码。你写qmake项目点下构建按钮背后执行的东西是调用 qmake 生成 Makefile再调用makemake再去调gg调汇编器和链接器最终链上libQt5Widgets.so这些库。所以编译器和编辑器在概念上是两条线编辑器是给人用的界面编译器是把代码变成可执行文件的那串工具。在 ARM64 上这条链条上每一环都必须是 aarch64 版本。我见过有人从 x86 机器上拷了一个gcc二进制过来能跑因为 x86_64 内核能跑 x86 程序但用它去编 Qt 程序就会在链接阶段炸掉——你编出来的是 x86_64 的目标文件跟系统里的libQt5Core.soaarch64对不上链接器直接告诉你格式不兼容。判断机器架构最直接的办法就是uname -m # aarch64 就是 64 位 ARM # x86_64 就是常规 PC dpkg --print-architecture # arm64 或 amd64这里顺手说清一个高频疑问arm64 和 amd64 到底有什么不同。从使用者角度最大的差别不是性能而是生态成熟度——amd64 上任何一个软件的官网都会给你一个 x86_64 的安装包而在 arm64 上你大概率要面对官网只提供源码或者官方二进制是 x86_64 的这两种情况。ARM64 采用定长 32 位指令、寄存器更多、内存模型更宽松这些对写 C 的人没有直接影响但会影响到你要链接的库有没有预编译版本。1.2 三条路线各自适合谁我把可行的方案整理成三类你先按自己的约束条件选一条别三条混着来路线耗时版本上限适合场景发行版仓库 apt/dnf10 分钟受发行版冻结版本限制只想快速验证、做小工具、教学官方离线包 / 源码包1 到 3 小时可自选 Qt 5.15、6.x需要新特性、需要特定模块从源码全量编译3 到 10 小时完全自由需要裁剪、需要定制、交叉编译QEMU 模拟的 x86 环境编译 ARM 包取决于宿主自由在 x86 机器上为 ARM64 出包最后一行说的是另一个常见场景手上只有 x86_64 的开发机但要产出 ARM64 的 Qt 程序。这时候的常规做法是用qemu-aarch64-static配合 chroot或者用容器工具链的跨架构构建能力在 x86 机器上模拟一个 aarch64 的根文件系统在里面装交叉编译需要的库。要注意的是 QEMU 的用户态模拟性能损失很明显编译 Qt 这种大工程会比真机慢三到五倍我一般只用它来产出一个小体积的验证程序不用它编全量 Qt。1.3 一个经常被忽略的前提开发包和运行库是两回事libqt5core5a这类是运行库装上它你的程序能跑qtbase5-dev这类是开发包装上它你才能编译。很多人装完 QtCreator 之后新建项目一编译就报cannot find -lQt5Widgets根本原因就是只有运行库没有开发包。这个区分在 ARM64 上尤其重要因为部分发行版为了控制镜像体积桌面版默认只带运行库。提示判断开发包是否装全最快的办法是dpkg -l | grep qtbase看-dev结尾的包在不在而不是去看 QtCreator 能不能打开。2. 先用发行版仓库把环境跑起来十分钟见效如果你只是想尽快看到界面上出现一个窗口别折腾源码先用仓库装。这条路线的意义在于把基础环境跑通后面再换版本时心里有底——至少你知道能跑起来需要哪些依赖出问题时也好对照。2.1 麒麟 V10 / Ubuntu arm64 上的安装命令麒麟 V10 桌面版和 Ubuntu 都是 apt 体系命令基本一致。我实测下来最省事的一组是sudo apt update sudo apt install -y build-essential cmake git sudo apt install -y qtcreator qtbase5-dev qt5-qmake qtbase5-dev-tools sudo apt install -y qttools5-dev-tools qtdeclarative5-dev sudo apt install -y libgl1-mesa-dev libglu1-mesa-dev sudo apt install -y libxcb-xinerama0 libxkbcommon-x11-0这里每一行的作用都值得说一下。build-essential拉的是 gcc、g、make、libc 开发头文件这一整套缺了它连hello world都编不出来。qtbase5-dev是核心开发包包含 Widgets、Core、Gui 三大模块的头文件和链接库。qt5-qmake单独装是因为部分发行版把它拆出去了qmake 不在的话 QtCreator 找不到任何 Qt 版本。qttools5-dev-tools里装着uic、moc、rcc这三个代码生成工具——注意这三个在 ARM64 上必须是 aarch64 版本从 x86 机器拷过来的用不了这点后面还会提到。最后两行是图形相关的依赖。libgl1-mesa-dev解决链接期的cannot find -lGLlibxcb-xinerama0和libxkbcommon-x11-0解决运行期的 xcb 插件加载失败。这两类报错在 ARM64 桌面环境里出现频率极高原因是很多 ARM 平台的发行版默认走 Wayland 或者精简过的 X 会话xcb 相关的库没预装。装完之后验证一下qmake -v # QMake version 3.1 # Using Qt version 5.15.3 in /usr/lib/aarch64-linux-gnu g --version qtcreator --versionqmake -v输出里的路径很关键它会告诉你 Qt 装在哪个前缀下这个路径后面配置 Kit 时要用到。2.2 打开 QtCreator 提示没有可用的 Kit怎么办这是仓库安装路线的头号问题。QtCreator 启动后点新建项目向导走到最后一页Kit 那一栏是灰色的或者干脆显示No valid kits found。别急着重装这个提示的含义是我知道有 Qt但我不确定它能编译。排查顺序我固定按这个来第一步看qmake -v能不能在终端里正常输出。输出正常说明 Qt 本体没问题问题在 QtCreator 的检测环节。第二步打开 QtCreator 的工具 - 选项 - Kits - Qt Versions看里面是不是空列表。如果是空的点添加手动指向/usr/bin/qmake或者上一步qmake -v给出的完整路径比如/usr/lib/qt5/bin/qmake。麒麟 V10 上我遇到过一次 qmake 实际在/usr/lib/aarch64-linux-gnu/qt5/bin/qmake/usr/bin/qmake只是个软链而 QtCreator 的自动检测对软链处理得不好手动指真实路径就解决了。第三步切到Compilers标签页看 C 那一栏有没有GCC (aarch64-linux-gnu-g)。没有的话手动添加路径填/usr/bin/g类型选 GCC。注意编译器的 ABI 要选对ARM64 上是arm-linux-generic-elf-64bit。这个选项选错的话Kit 会显示黄色感叹号提示编译器 ABI 与 Qt 不匹配。第四步回到Kits页面新建一个 Kit把它和刚才配好的 Qt Version、Compiler、Debugger 关联起来。Debugger 一般填/usr/bin/gdb。配好之后那个 Kit 前面的图标会变正常。我一般的习惯是顺手改个名字比如Desktop-ARM64-Qt5.15以后多套 Kit 并存的时候不容易点错。2.3 仓库版本的边界在哪里仓库路线的代价是版本被发行版冻结。Ubuntu 22.04 的 arm64 仓库里是 Qt 5.15.324.04 会同时带 Qt 5 和 Qt 6 的包麒麟 V10 SP1 的版本会更保守一些。这意味着几件事你想用 Qt 6.5 之后才有的新 API仓库给不了你想用某个只在 5.15.2 之后修复的 bug 修复可能正好卡在边界上。还有一个坑Unknown module(s) in QT: serialport。这个报错在 ARM64 上出现得特别频繁因为很多场景下你要用串口跟下位机通信这是 ARM 工控板的典型用法。根本原因是serialport是 Qt 的一个独立模块不在 qtbase 里sudo apt install -y libqt5serialport5-dev # Qt6 环境则是 sudo apt install -y qt6-serialport-dev装完之后在.pro里写QT serialport才能过。另外提醒一句串口设备在 Linux 上属于dialout组开发阶段如果不是用 root 跑得把自己的账号加进去否则程序能编译但打开串口会权限拒绝sudo usermod -aG dialout $USER # 重新登录后生效这类能编译但跑不起来的问题比编译报错更消耗时间因为它们不发生在 Qt 层而是发生在操作系统层的权限和设备节点管理上。3. 离线包路线把官方构件搬到 ARM64 上仓库版本不够用的时候就得考虑官方的构件。这里有个必须先讲清的事实不然会白折腾半天。3.1 官方二进制包的架构真相Qt 官方那套统一的安装器名字类似qt-unified-linux-x64-*.run里的x64不是随便起的——它是 x86_64 的 ELF 可执行文件。你把它拷到 ARM64 机器上chmod x之后执行内核会直接告诉你cannot execute binary file: Exec format error。这不是权限问题也不是包损坏纯粹是架构不匹配。同样的道理适用于官方的开源离线包。Qt 5.14.2 是最后一个提供开源离线安装包的版本而那个包同样是 x86_64 的。所以在 ARM64 上想用官方构件只有两条路一是在 x86_64 机器上跑安装器把需要的模块勾选上、下载下来然后把安装目录整个打包拷到 ARM64 机器上。这条路走不通的地方在于安装器下载的库文件是 x86_64 的.so拷过去也没法用。除非你在安装器里选择源码包下载那拷过去的就是源码等价于走源码编译路线。二是用 QEMU 用户态模拟来跑那个安装器。装qemu-user-static然后qemu-x86_64-static ./qt-unified-linux-x64.run。这个做法技术上可行但我实测下来问题不少安装器界面在模拟层下渲染异常而且就算装完了下载下来的还是 x86_64 的 Qt 库。所以我个人的结论很直接——在 ARM64 上官方二进制安装器这条路基本走不通直接跳到源码编译更省时间。真正可行的是第三种下载 Qt 的源码包。官方归档站上提供qt-everywhere-src-5.15.2.tar.xz这类整包也有按模块拆分的单包。整包体积在 500MB 到 1GB 之间解压之后轻松占到 2GB 以上。3.2 补依赖libxcb 家族是最烦的一环不管走哪条路只要你的程序是带界面的编译期和运行期都会跟 X11 的 xcb 库打交道。ARM64 发行版上这些库经常是装了一半的状态表现为编译能过但运行时报qt.qpa.plugin: Could not load the Qt platform plugin xcb in even though it was found. This application failed to start because no Qt platform plugin could be initialized.这个报错的迷惑性在于它说插件找到了但加载不了很多人以为是 Qt 的插件路径配错了其实九成是插件依赖的动态库缺了。定位方法很简单用ldd直接看插件依赖ldd /opt/Qt5.15.2/plugins/platforms/libqxcb.so | grep not found输出的每一行not found就是你要装的库。在 Ubuntu arm64 上最常见的几个按出现频率排sudo apt install -y libxcb-icccm4 libxcb-image0 libxcb-keysyms1 \ libxcb-randr0 libxcb-render-util0 libxcb-shape0 libxcb-xinerama0 \ libxcb-xkb1 libxkbcommon-x11-0 libxcb-xinput0麒麟 V10 上还有一个额外情况部分镜像源里libxcb-xinput0的包名带了版本号后缀直接 apt 装会提示找不到包。这种时候用apt-cache search libxcb | grep xinput查一下实际包名再装比硬试快得多。注意ldd报not found的库不一定是真的没装也可能是装在了非标准路径下、动态链接器搜不到。这种情况要检查/etc/ld.so.conf.d/下的配置或者用LD_LIBRARY_PATH临时指定。我遇到过一个是把 Qt 装到了/opt下但没加 ldconfig 配置所有依赖 Qt 库的程序都报找不到。3.3 用 QT_DEBUG_PLUGINS 揪出加载失败的具体环节Qt 有个非常好用的环境变量QT_DEBUG_PLUGINS1开启之后所有平台插件的加载过程都会打出来包括它尝试了哪些路径、加载了哪个 .so、以及失败时的具体原因是找不到符号还是找不到依赖。QT_DEBUG_PLUGINS1 ./myapp输出会很长重点看两处一是QFactoryLoader::QFactoryLoader() checking directory path ...这些行它告诉你 Qt 去哪些目录找插件了二是每个插件后面跟的加载结果成功是loaded library失败会带上Cannot load library ... (reason)括号里的原因通常就是缺失的符号或者缺失的依赖库名。这个技巧我推荐所有人记住因为 ARM64 环境下图形栈的差异比 x86 大得多同样的代码在 x86 上跑得好好的换到 ARM 板子上就可能因为某个发行版把 xcb 换成了纯 Wayland 而挂掉。有QT_DEBUG_PLUGINS在手至少能确定问题出在找不到插件还是插件加载失败这两个完全不同的层面。顺带说一句平台插件的强制指定。如果目标机器只有 Wayland 没有 X那就export QT_QPA_PLATFORMwayland如果两者都有但你怀疑 xcb 有问题可以QT_QPA_PLATFORMminimal跑一下——minimal 插件不需要任何图形依赖能跑通就说明业务代码没问题纯粹是图形后端的事。4. 源码编译版本自由代价是时间和内存源码编译是 ARM64 上最可控的一条路。好处是版本随你挑、模块随你裁坏处是编译时间长、内存吃得多而且 configure 参数配错一次就要重来。4.1 configure 参数怎么定一次配对的思路先解压然后建一个独立的构建目录——这一步别省Qt 支持影子构建在源码目录里直接 configure 会污染源码树后面想换配置重新编的时候很痛苦tar -xf qt-everywhere-src-5.15.2.tar.xz mkdir qt-build cd qt-build ../qt-everywhere-src-5.15.2/configure \ -prefix /opt/Qt5.15.2 \ -opensource -confirm-license \ -release \ -nomake examples \ -nomake tests \ -skip qtwebengine \ -skip qt3d \ -skip qtquick3d逐个解释这几个参数为什么这么选。-prefix决定安装前缀我习惯放/opt/Qt5.15.2好处是多版本可以并存以后装 6.x 不会互相覆盖。-opensource -confirm-license是开源版必须显式同意的不写会停在交互式确认上脚本化安装会卡住。-release只编发布版省掉接近一半的编译时间除非你要调试 Qt 自身的崩溃否则不需要 debug 版。-nomake examples -nomake tests这两个是省时间的关键。Qt 的示例和测试代码量比库本体还大在 ARM64 上编它们纯属浪费实测能省掉两到三成的时间。-skip qtwebengine必须重点说。这个模块内嵌了一个 Chromium源码体积和编译时间都是整个 Qt 里最大的在 ARM64 上编译它需要至少 16GB 内存和几十 GB 磁盘而且在很多 ARM 平台上根本编不过。除非你的项目明确要用 WebEngine一律跳过。qt3d和qtquick3d也是同理体积大、用得少。-qt-xcb这个参数要根据发行版情况决定。它让 Qt 使用自带的 xcb 库而不是系统的好处是规避系统库版本不一致的问题坏处是编译时间增加、且如果系统有其他程序共享这些库可能出现符号冲突。我的经验是发行版比较新Ubuntu 22.04 及以上就用系统库镜像比较老麒麟 V10 初期版本就加上-qt-xcb更稳。configure 跑完会输出一份总结会有几行Note:提示哪些依赖没找到、哪些模块会被跳过。这份总结要逐行看别直接回车过去。比如它会告诉你xcb-xinput没找到那么后面带触摸输入相关的功能就会缺失。4.2 编译 QtCreator 本体注意它的构建系统换代了QtCreator 自己的编译方式在版本之间变过。早期是纯粹的 qmake 工程现在是 CMake 主导。所以第一步是先确认你拿到的是哪个版本。对于用 qmake 的版本大约 4.x 及更早cd qtcreator-src qmake ../qtcreator-src/qtcreator.pro make -j$(nproc) sudo make install对于用 CMake 的版本5.x 及以后mkdir build cd build cmake -DCMAKE_PREFIX_PATH/opt/Qt5.15.2 \ -DCMAKE_INSTALL_PREFIX/opt/qtcreator \ ../qtcreator-src cmake --build . --parallel $(nproc) cmake --install .CMAKE_PREFIX_PATH这个参数是核心它告诉 CMake 去哪里找 Qt 的Qt5Config.cmake。不指定的话CMake 会去系统路径找结果就是它链上了系统自带的 Qt 5.15.3而不是你刚编的 5.15.2两者的私有头文件 ABI 可能对不上运行时报诡异错误。这里有个真实踩过的坑QtCreator 的 CMake 配置阶段会去找Qt5Core、Qt5Widgets但有一段时间的版本还会硬性依赖Qt5Script因为老的表达式求值引擎而Qt5Script不在 qtbase 里需要单独编qtscript模块。如果配置阶段报Could not find a package configuration file provided by Qt5Script那就是缺了这个模块。装系统包qtscript5-dev是最快的办法不一定非要自己编。编译完的 QtCreator 是可执行文件加一堆插件安装到/opt/qtcreator之后可以直接跑。如果提示找不到 Qt 库在启动脚本里加上export LD_LIBRARY_PATH/opt/Qt5.15.2/lib:$LD_LIBRARY_PATH4.3 用 ccache 和并发度把时间压下来ARM64 平台编译 Qt 的时间我实测过的几个数据8 核的 ARM 服务器编 qtbase 大约 40 分钟全量 Qt跳过 webengine3 到 4 小时4 核的 ARM 开发板编 qtbase 要 1.5 小时以上。这个时间量级下两个优化手段的收益非常明显。第一个是ccache。装上之后 configure 会自动检测并使用sudo apt install -y ccache export PATH/usr/lib/ccache:$PATH ccache -M 10G # 缓存上限设大一点ccache 的价值在于增量重编。你改了 configure 参数重新跑只要源文件没变编译结果直接从缓存拿第二次编译可能只要几分钟。对反复调参数的人这几乎是刚需。第二个是并发度。make -j$(nproc)是常规做法但在 ARM64 上要小心每个 g 进程编 Qt 的大文件时峰值内存可能到 1.5GBnproc如果是 16 而内存只有 8GB大概率会触发 OOM。internal compiler error: Killed (program cc1plus)或者virtual memory exhausted: Cannot allocate memory就是内存不够的典型信号这也是热词里说的编译器的堆空间不足的真实来源。正确的做法是把并发度压到内存GB / 2左右make -j4 # 8GB 内存的机器用这个值比较稳如果不想降并发度另一个办法是加 swap。给编译临时加 8GB 交换文件sudo fallocate -l 8G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile编译完记得swapoff再删掉不然 swap 长期占着磁盘、还会拖慢日常使用。5. Kit 配置与第一个能跑的程序环境和库都就位之后最后一步是把它们串起来。这一步配错了前面所有工作都白做因为 QtCreator 不会自己去猜你想用哪套 Qt。5.1 手工注册 Qt Version 和 Compiler打开工具 - 选项 - Kits按这个顺序来。先到Qt Versions点添加选/opt/Qt5.15.2/bin/qmake。选完之后 QtCreator 会自动跑一次qmake -query把版本、路径、mkspec 都读出来显示成一行Qt 5.15.2 (qt5)。如果这里报错说 qmake 无法执行先到终端里手工跑一下确认它能输出。再到Compilers确认有个GCC (aarch64-linux-gnu-g)。ABI 这一项必须选对ARM64 上要选arm-linux-generic-elf-64bit。选成x86-linux-generic-elf-64bit的话Kit 会显示黄色感叹号。这个下拉框的选项名称在不同 QtCreator 版本里措辞略有差异但带arm和64bit的那个就是。最后到Kits页面新建把 Qt Version、Compiler、Debugger 关联起来。如果 qmake 和 g 的架构不一致Kit 会直接标红这是一道很有用的防线——它能在你点下构建之前就告诉你这套组合产不出可执行文件。5.2 交叉编译场景下的 sysroot 和工具链前缀如果你的工作模式是在 x86 主机上编把程序拷到 ARM64 板子上跑那 Kit 的配置思路完全不同需要装交叉工具链sudo apt install -y g-aarch64-linux-gnu然后在 QtCreator 的Compilers里添加/usr/bin/aarch64-linux-gnu-gABI 同样选 arm 64bit。关键差异在于你要用 ARM64 版本的 Qt 库也就是说 x86 主机上得有一份交叉编译出来的 aarch64 Qt。这通常意味着你要在 x86 主机上用-device linux-aarch64-gnu-g这个 mkspec 重新编一遍 Qt或者直接用 QEMU 里的 aarch64 环境编一份出来再把结果拷出来。这套流程里最容易出问题的是sysroot。交叉编译时头文件和库的查找路径必须指向目标系统的根文件系统否则会出现头文件版本对不上或者链接到了宿主机的 x86 库这类问题。Qt 的 mkspec 文件里可以配置QMAKE_SYSROOTQtCreator 的 Kit 页面也有对应的 sysroot 字段可以填。我一般只填两个地方Kit 的 sysroot 和工具链的--sysroot参数保持两处一致不要一处配一处不配。提示交叉编译最省事的验证方式是先在命令行里编一个小程序aarch64-linux-gnu-g main.cpp -o test -lQt5Widgets通了再进 QtCreator 配 Kit。GUI 工具出的错往往被包装过命令行给的信息更原始。5.3 最小验证程序与常见模块缺失Kit 配好之后别急着上真实项目先来一个最小的 Widget 程序验证链路。新建Qt Widgets Application选刚才配的 Kit.pro里保持默认主函数什么都不改直接构建运行。如果你看到窗口出来整条链路就是通的。如果这一步报Unknown module(s) in QT: serialport或者类似的其他模块名说明.pro里写了QT xxx但对应的模块没装。处理方式分两种情况走仓库路线的话直接装对应的-dev包走源码路线的话模块要么在编译时-skip掉了要么本来就不在 qtbase 里需要单独编。举几个常见的对应关系.pro 里的模块对应的仓库开发包说明serialportlibqt5serialport5-dev串口通信工控场景高频sqllibqt5sql5-sqlite等数据库驱动按需装network含在 qtbase 中一般不需要额外装multimedialibqt5multimedia5-plugins音视频chartslibqt5charts5-dev图表webenginewidgetsqtwebengine5-dev体积巨大ARM64 上易出问题还有一种情况是.pro里明明没写但qmake报某个模块找不到。这时候检查一下是不是复制过来的项目里带了QT ...而你没注意或者.pri文件里间接引入了。用qmake -d打开调试输出能看到变量是怎么被一步步拼起来的信息量很大。Qt 里读写 JSON 用的是QJsonDocument、QJsonObject这几个类属于 Core 模块不需要额外配置绘图相关的QPainter、QGraphicsView属于 Gui 和 Widgets也都在 qtbase 内。真正需要单独装模块的通常是串口、蓝牙、图表、多媒体、WebEngine 这几个提前在.pro里列清楚比编到一半报错再回头补要高效。6. 踩坑记录与实测数据前面讲的都是应该怎么做这一节讲的是实际会怎么坏。我把这一整天里遇到的报错按出现频率整理成一张表遇到的时候直接对着查。6.1 高频报错对照表报错信息根本原因处理方式cannot execute binary file: Exec format error执行了 x86_64 的二进制换 aarch64 版本或用 QEMU 模拟cannot find -lGL缺 OpenGL 开发库apt install libgl1-mesa-devCould not load the Qt platform plugin xcb插件依赖库缺失ldd libqxcb.so | grep not found逐个补Unknown module(s) in QT: serialport模块未安装装对应-dev包internal compiler error: Killed编译时内存耗尽降-j并发度或加 swapvirtual memory exhausted同上另一种表现形式同上No valid kits foundqmake 或编译器未注册手工在选项里注册Project ERROR: Cannot run compiler g编译器路径失效或权限问题检查路径确认可执行程序打开串口报权限拒绝用户不在 dialout 组usermod -aG dialoutQtCreator 启动后界面空白图形后端不匹配试QT_QPA_PLATFORM各值这张表里我想特别展开两条。第一条是Exec format error它几乎总是拿了不对架构的二进制这一件事包括可执行文件、静态库、.so、甚至 moc/uic 这类代码生成工具。判断一个二进制是什么架构file命令最快file /path/to/binary输出里带ARM aarch64还是x86-64一目了然。这个习惯建议养成尤其是在拷来拷去的流程里。第二条是 QtCreator 界面空白。这个问题的症状很诡异进程起来了终端没报错但窗口就是一片白或者干脆不显示。原因通常是 QtCreator 用的是系统 Qt 加系统图形后端而你的机器上 X 和 Wayland 混装或者配置不完整。我遇到过一次是在麒麟 V10 上系统默认会话是 Wayland但 QtCreator 打包时用的是 X11 插件结果就白屏。解决办法是明确指定QT_QPA_PLATFORMxcb qtcreator # 或者 QT_QPA_PLATFORMwayland qtcreator两个都试一下哪个能出界面就用哪个然后把这行写进桌面快捷方式或者~/.profile避免每次都要手工敲。6.2 资源账要先算清楚源码编译 Qt 这个事资源账必须先算。我实测的一个参考值解压后的 qt-everywhere-src-5.15.2 大约占 2.5GB构建目录在中途会涨到 15GB 以上安装目录大约 1.5GB跳过 webengine 的情况下。也就是说整条流程至少要准备 25GB 以上的空闲磁盘如果包含 webengine 那一项就要翻倍。内存方面8GB 是底线16GB 会舒服很多。除了前面说的-j并发度和 swap还有一个细节是构建目录和源码目录要放在同一块盘上因为 Qt 的构建过程里有大量读写跨盘操作会明显变慢。如果你用的是 eMMC 或者 SD 卡作为根分区很多 ARM 开发板是这样编译时的 IO 会成为瓶颈我才建议用外接 SSD 或者在别处编好了再拷结果回来。编译时间上我在一台 8 核 ARM64 服务器上的实测数据大致是qtbase 单模块 35 到 45 分钟qtdeclarative 约 40 分钟全量不含 webengine3 到 4 小时。如果是 4 核的开发板全量编译过夜是常态别指望一两小时能搞定。6.3 没有图形界面时的处理很多 ARM64 设备是纯命令行环境或者你通过 SSH 连过去压根没有图形会话。这种情况下 QtCreator 用不了但编译和使用 Qt 程序完全没问题——只要装的是开发包而不是依赖 GUI。无界面环境下编 Qt 程序直接在命令行用 qmake 加 make 就行mkdir build cd build /opt/Qt5.15.2/bin/qmake ../myproject.pro make -j4如果程序必须渲染界面但你又没有物理显示器QT_QPA_PLATFORMoffscreen可以让你在无图形环境下跑起来做逻辑验证界面不会真正显示但程序的绘制调用都会正常执行适合跑自动化测试。另外minimal插件也可以但它不实现完整的绘制只适合验证程序能不能启动。还有一个容易被忽略的点Qt 程序在没有$DISPLAY的环境下启动默认会尝试连 X server失败后直接退出。如果你只是想让程序在后台跑一下记得显式指定平台插件不然会看到各种连接失败的消息。这篇文章写到这基本把 ARM64 上从零搭 Qt 环境的几条路都走了一遍。我个人的偏好是新机器先用仓库版把环境跑通、把 Kit 配好确认整条链路没问题然后如果项目对版本有要求再上源码编译把新版本装到/opt下并用第二套 Kit 管起来两套并存互不干扰。踩过的最大的坑其实是概念层面的——把 QtCreator 和编译器当成一件事以及以为官网给的二进制能在 ARM64 上直接用。把这两个认知纠正过来之后剩下的都是查依赖、看日志的机械工作了。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑