简介Qt5.14.2产物-银河麒麟-ARM64资源包是面向国产操作系统开发者的完整头文件集合适用于在银河麒麟ARM64环境下编译原生Qt应用。资源共2000个文件其中1991个h头文件覆盖Qt5.14.2核心模块及OpenGL、QtWebEngine、网络等扩展组件9个txt文档提供构建配置与版本说明压缩包整体约480MB目录结构清晰便于按模块引用已有720人学习下载。借助Qt5.14.2在QML声明式界面、Qt3D图形渲染、HTTP/2网络通信以及Unicode 12.1多语言支持等特性上的增强开发者可直接引用这些头文件完成代码编写与交叉编译节省从源码构建Qt库的时间。包含QtWebEngine的Chromium支持使应用在麒麟系统上也能呈现现代网页与混合界面QtQuick Controls 2则提供与国产系统视觉风格贴近的自定义控件。这套资源尤其适合政府、企业级国产化项目中的中高级Qt开发人员可作为在银河麒麟ARM64平台上进行原生应用开发、调试与性能优化的基础依赖帮助快速掌握Qt5.14.2在国产芯片环境下的适配要点。 Qt5.14.2在银河麒麟ARM64上部署这件事项目标题看着就五个词但背后藏着一条完整的技术链路开发机上用Qt 5.14.2编译好的产物要拿到ARM64架构的银河麒麟系统上稳定跑起来。我最近就处理了一个类似交付折腾完最大的感受是——这事不难但坑非常细碎架构判断、Qt运行库、平台插件、图形渲染、系统离线环境任何一环没对齐程序都起不来。这篇文章就是围绕这个标题做的一次完整复盘。我会从架构差异讲起结合在银河麒麟系统上编译、打包、排障的实际过程把每个关键步骤和踩过的坑都写清楚。适合手头有Qt程序要往银河麒麟ARM64机器上迁移或者正被“二进制拷过去跑不起来”折磨的开发、交付、运维同学参考。1. 先搞清楚Qt5.14.2产物在银河麒麟ARM64上到底卡在哪1.1 架构检查省不了AMD64和ARM64不是一回事很多人在热搜里问“AMD64和ARM64的区别”放到Linux平台也是一样。AMD64也叫x86_64是Intel和AMD处理器的64位指令集ARM64AArch64是ARM处理器的64位指令集。两者编译出来的机器码完全不兼容一个在x86_64上编译好的Qt5.14.2产物拿到ARM64的麒麟机器上直接报cannot execute binary file: Exec format error。所以我接手这类交付的第一件事永远是先确认目标机器架构。uname -m输出aarch64就是ARM64输出x86_64就是AMD64。就这么一条命令能省掉后续所有莫名其妙的排查时间。很多人在ARM机器上拿x86安装包反复试错大概率就是漏了这一步。1.2 银河麒麟的软件包管理不同版本差别很大银河麒麟V10的系统身份本质上是一个基于Linux内核定制发行的系统。说到“银河麒麟安装软件命令”网上答案基本会给你两条路线基于Debian/Ubuntu改的版本用apt和dpkg基于CentOS/RHEL改的版本用yum和rpm。没有唯一答案必须先看目标机是哪个体系。cat /etc/os-release这个命令会输出系统版本信息和ID能看出来到底是走apt还是yum。更让人头疼的是很多麒麟机器部署在内网环境根本没有可用公网软件源甚至公司内部源都没配置好。这直接导致你在开发机上一条apt install搞定的事到现场要手动收集一堆deb/rpm包离线导入。这是后面所有部署工作最大的不确定性来源。1.3 Qt 5.14.2的“版本锁定”效应Qt 5.14.2不是一个随便能替代的版本。5.14在Qt历史上处于一个相对微妙的节点往后是5.15 LTS但很多适配ARM平台的项目恰恰绑定了5.14.2因为大量国产芯片和整机厂商的适配文档、示例工程都基于这个版本。你用Qt5.14.2编出来的程序依赖的是libQt5Core.so.5等运行库而Qt内部有一套符号版本机制如果目标机上的Qt库版本不一致启动时会报类似于version Qt_5.14.2 not found的错误。所以核心矛盾就一句话要在目标机上跑Qt产物要么把Qt 5.14.2的运行库完整带过去要么在目标机上装一套一模一样的Qt 5.14.2。别指望系统自带的Qt版本能兼容版本差一点就是起不来。2. 方案选型交叉编译还是真机原生编译2.1 交叉编译省时间但配置成本同样高如果是要批量交付几十台上百台ARM64麒麟机器正统做法是在x86_64开发机上搭建aarch64-linux-gnu交叉编译工具链再用Qt的交叉编译版本直接产出ARM64产物。好处很明显开发机不用换编译速度快一条流水线出所有架构的包。但代价是Qt 5.14.2的交叉编译配置相当折腾。你得准备ARM64的sysroot要针对银河麒麟调整qmake的mkspec还要让configure阶段正确识别目标平台。我见过很多团队卡在configure这一步报各种Unknown test、Compiler cannot create executables最后往往不是代码问题而是工具链和sysroot不匹配。如果项目规模不大或者你只是要在几台机器上验证运行效果我更推荐的是在ARM64真机上原生编译。把开发环境直接搬到目标机下载Qt5.14.2源码编译兼容性最稳问题最少。别觉得原生编译慢现在ARM64机器性能都不差尤其飞腾D2000、鲲鹏920这类处理器编译个Qt核心模块完全可接受。2.2 在ARM64上获取Qt5.14.2的三种途径第一种是Qt官方在线安装器。但官方Linux版安装器本身大都是x86_64架构在ARM64真机上不一定能直接跑起来所以这条路经常走不通。第二种是下载qt-everywhere-src-5.14.2.tar.xz源码包在目标机上自行configure、make、install。这是最可控的方式也是我推荐的方式。源码包在Qt官方archive目录下下载后记得做sha256校验确保包完整。第三种是从第三方渠道下载ARM64预编译包。这条路风险最高来源不明、可能缺模块还可能带着别人环境里的古怪配置。我一般不推荐除非你能确认包来源可信并且有完整校验信息。2.3 构建系统qmake还是CMake银河麒麟ARM64上编译Qt5.14.2工程大部分人延续原有习惯老项目用qmake新项目用CMake。我的建议是别在平台迁移时切换构建系统开发机原本用什么就继续用什么。qmake在源码目录执行qmake -o Makefile your_project.pro make -j4CMake则要多设置一个CMAKE_PREFIX_PATH指向Qt安装目录cmake -B build -DCMAKE_PREFIX_PATH/opt/Qt5.14.2 cmake --build build -j4如果Qt安装路径不规范CMake经常找不到Qt5Config.cmake报Could not find a package configuration file。qmake倒是很少出这个问题因为它基于QTDIR环境变量和qmake本身的路径逻辑来定位库。平台迁移期变量越少越好这是经验之谈。3. 实操在银河麒麟ARM64上编译并部署Qt5.14.2产物3.1 环境体检与依赖安装登录目标机后先做一套环境体检uname -a cat /etc/os-release uname -m确认是aarch64、确认麒麟V10的具体SP版本。不同SP版本的软件仓库差别会影响后续依赖包安装。然后安装编译工具和Qt基础依赖。如果是apt体系的麒麟版本执行sudo apt update sudo apt install -y build-essential libgl1-mesa-dev libfontconfig1-dev libfreetype6-dev libxkbcommon-x11-dev libxcb*-dev注意libxcb*-dev这一组。Qt的XCB平台插件依赖大量xcb系列库比如libxcb-icccm4-dev、libxcb-keysyms1-dev、libxcb-xinerama0-dev一次性装齐能避免后面跑Qt程序时报could not find or load the Qt platform plugin xcb。如果你拿到的机器是隔离网环境就得提前在有网的、同架构同版本的机器上把deb包拉下来。一个很实用的方法是mkdir debs cd debs apt-get download libxcb-xinerama0 libxcb-xkb1 libxkbcommon-x11-0 ...然后把整个debs目录拷到目标机执行sudo dpkg -i *.debdpkg -i有个缺点遇到依赖缺失会中断你就得按提示一个个补。所以抓包时尽量把依赖树抓全别只抓一层。3.2 编译Qt 5.14.2源码下载源码并解压wget https://download.qt.io/archive/qt/5.14/5.14.2/qt-everywhere-src-5.14.2.tar.xz tar xf qt-everywhere-src-5.14.2.tar.xz cd qt-everywhere-src-5.14.2配置构建参数。如果只需要常见Widgets程序可以裁剪掉示例和测试加快编译./configure -prefix /opt/Qt5.14.2 -release -opensource -confirm-license -nomake examples -nomake tests如果需要WebEngine等重型模块编译时间会成倍增加还得额外准备Python、ninja、libssl-dev等依赖ARM64上编译WebEngine经常因为内存不足直接OOM。所以能裁剪就裁剪。构建安装make -j$(nproc) sudo make install编译时间方面飞腾D2000八核心机器全量编译大约40到60分钟只编译核心模块会快很多。如果遇到OOM可以降低并行度比如make -j2。3.3 程序打包与运行库收集Qt 5.14.2编译安装好后把你的工程源码拷到目标机重新跑一遍qmake/CMake和make生成的就是真正的ARM64产物。但那只是第一步这个二进制直接拷到另一台干净的ARM64麒麟机器仍然可能因为缺少Qt运行库而跑不起来。所以需要做依赖收集。先看产物链接了哪些库ldd ./your_appname重点关注输出里来自/opt/Qt5.14.2/lib的库比如libQt5Core.so.5、libQt5Gui.so.5、libQt5Widgets.so.5。把这些库和插件目录一起拷到程序目录cp /opt/Qt5.14.2/lib/*.so* ./your_app_dir/ cp -r /opt/Qt5.14.2/plugins ./your_app_dir/plugins注意plugins目录一定要带Qt在Linux桌面上是通过libqxcb.so平台插件和系统交互的忘记拷插件程序照样起不来。3.4 启动脚本和权限处理程序目录准备好之后写一个启动脚本run.sh#!/bin/bash APP_NAMEyour_appname APP_DIR$(cd $(dirname $0) pwd) export QT_QPA_PLATFORM_PLUGIN_PATH$APP_DIR/plugins/platforms export QT_PLUGIN_PATH$APP_DIR/plugins export LD_LIBRARY_PATH$APP_DIR:$APP_DIR/lib:$LD_LIBRARY_PATH export QT_IM_MODULE${QT_IM_MODULE:-fcitx} export QT_OPENGL${QT_OPENGL:-software} cd $APP_DIR exec ./$APP_NAME $这里有三层逻辑一是把Qt运行库指向程序目录不污染系统二是显式指定输入法模块避免Qt程序在麒麟桌面上打不出中文三是默认软件渲染规避部分ARM板卡显卡驱动不稳定导致的黑屏花屏。然后记得chmod x run.sh your_appname到这一步一个自带Qt 5.14.2运行环境的ARM64麒麟部署包就算成型了。4. 部署后的常见问题与排障实录4.1 错误速查表现象原因解决方式Exec format error架构不匹配x86二进制拷到ARM64在ARM64环境重新编译version Qt_5.14.2 not found系统Qt版本与程序编译时不一致把Qt5.14.2库随程序分发could not find or load the Qt platform plugin xcbplugins/platforms目录缺失或xcb依赖不全拷贝Qt插件目录安装libxcb*-devPermission denied无执行权限chmod x程序启动黑屏/花屏GPU驱动或OpenGL支持异常export QT_OPENGLsoftware双击图标无反应桌面环境未加载环境变量用启动脚本或.desktop文件启动cannot connect to X serverDISPLAY环境变量未设置确认是在图形会话下运行echo $DISPLAY这个表是所有现场交付的通用排查入口覆盖了我在实际部署中遇到的绝大多数问题。4.2 网络、输入法与桌面环境的坑搜索热词里有一堆银河麒麟使用问题比如修改MTU、浏览器打不了字、开机卡界面、忘记登录密码、网上邻居看不到等。这些单看和Qt发布无关但部署现场很容易被同一类系统问题绊住。第一个是网络问题。内网VLAN环境下默认MTU 1500可能导致大包丢弃表现是wget卡住、apt下载中断。临时改小MTUsudo ip link set dev eth0 mtu 1400这在银河麒麟ARM64上排障很管用很多时候不是源的问题就是网络链路MTU不合适。第二个是输入法。Qt程序打不了字特别是中文打不出来绝大多数是输入法框架和Qt桥接没配对。麒麟系统常见fcitx和ibus两套框架在启动脚本里显式指定export QT_IM_MODULEfcitx如果用的ibus就改成ibus。这个变量一旦设置正确中文输入立刻恢复。第三个是开机进不去桌面比如“开机后一个光标在闪”。这个问题通常和显示驱动、图形栈启动异常有关和Qt程序无直接关系但如果是现场交付机器起不来你程序再好也白搭。建议备一个同版本银河麒麟系统U盘进修复模式检查驱动和启动项。热词里还有人问“不要备份分区能不能用”我的建议是临时调试可以不要但正式交付前务必做系统盘快照ARM64板子的启动修复比x86麻烦得多。4.3 离线环境的部署准备很多银河麒麟机器完全无法访问外网给它们装软件、装依赖只能靠离线包。除了Qt本身还经常要装配套软件比如搜索词里高频出现的“银河麒麟系统中安装mysql-8.4.7”。MySQL 8.4.7的安装逻辑放到这个平台上也逃不开离线依赖问题。常见步骤是先解压tar包建mysql系统用户初始化数据目录写my.cnf再启动服务。但实际执行时最常卡在libncurses.so.5、libaio.so.1这种基础库缺失。这和Qt程序跑不起来的本质一样ARM64平台上的所有二进制部署核心就三件事——架构匹配、依赖齐全、权限正确。缺一不可。所以我的习惯是给每台交付机器准备一个“部署素材包”里面包含Qt 5.14.2编译成果/opt/Qt5.14.2整个目录打包业务程序目录程序libpluginsrun.sh所有额外依赖的deb/rpm包一个install.sh自动解压、拷贝、设置环境变量这样到现场就算没网也不会抓瞎。5. 把踩坑经验固化成交付清单5.1 交付前必做的三项检查第一项确认产物实际链接的Qt版本。不要只信“Qt5.14.2产物”这句话开发机上多Qt环境很容易混淆链接版本。用ldd your_app | grep Qt或strings your_app | grep Qt 5快速确认10秒钟能省一整天的排查时间。第二项验证平台插件完整性。在干净的目标机上运行前先检查plugins/platforms/libqxcb.so是否存在再用ldd plugins/platforms/libqxcb.so | grep not found看它的依赖是否齐全。这块缺失是Qt程序在麒麟ARM64上最典型的启动失败原因。第三项完整回归测试。同为ARM64飞腾D2000和鲲鹏920的图形栈、内核版本可能有差异。同一个Qt程序在一块板子上没问题换一块黑屏或崩溃我都遇到过。所以不要在“都是aarch64肯定通用”这个假设下省测试。5.2 现场排障的兜底流程如果现场碰到程序起不来我习惯按这个顺序排查uname -m # 1. 架构对不对 file ./your_app # 2. 二进制格式对不对 ldd ./your_app # 3. 依赖库缺没缺 ./your_app -v # 4. 命令行直接跑看报错如果是平台插件问题就看$APP_DIR/plugins/platforms/如果报OpenGL相关错误就用QT_OPENGLsoftware兜底如果怀疑系统环境变量问题就在脚本里把QT_QPA_PLATFORM_PLUGIN_PATH、LD_LIBRARY_PATH全部显式指到本地目录。兜底做完了仍然不行再考虑系统层面的问题比如显示驱动、磁盘空间、交换分区。ARM64机器上交换分区不够编译大工程或运行WebEngine程序时容易莫名崩溃检查一下free -h和swapon --show该扩就扩。最后再说一个实际操作里的小习惯拿到一台新的ARM64麒麟机器第一件事是装好SSH、做好当前系统的快照或备份再动手装依赖。因为这个平台的系统恢复成本明显高于x86台式机很多现场事故都是装机阶段埋下的雷。备份不花多少时间但能让你在折腾Qt 5.14.2时毫无顾虑翻车了随时还原重头再来。本文还有配套的精品资源点击获取
