简介: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位指令集;ARM64(AArch64)是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_NAME="your_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 xcb | plugins/platforms目录缺失或xcb依赖不全 | 拷贝Qt插件目录,安装libxcb*-dev |
| Permission denied | 无执行权限 | chmod +x |
| 程序启动黑屏/花屏 | GPU驱动或OpenGL支持异常 | export QT_OPENGL=software |
| 双击图标无反应 | 桌面环境未加载环境变量 | 用启动脚本或.desktop文件启动 |
| cannot connect to X server | DISPLAY环境变量未设置 | 确认是在图形会话下运行echo $DISPLAY |
这个表是所有现场交付的通用排查入口,覆盖了我在实际部署中遇到的绝大多数问题。
4.2 网络、输入法与桌面环境的坑
搜索热词里有一堆银河麒麟使用问题,比如修改MTU、浏览器打不了字、开机卡界面、忘记登录密码、网上邻居看不到等。这些单看和Qt发布无关,但部署现场很容易被同一类系统问题绊住。
第一个是网络问题。内网VLAN环境下,默认MTU 1500可能导致大包丢弃,表现是wget卡住、apt下载中断。临时改小MTU:
sudo ip link set dev eth0 mtu 1400这在银河麒麟ARM64上排障很管用,很多时候不是源的问题,就是网络链路MTU不合适。
第二个是输入法。Qt程序打不了字,特别是中文打不出来,绝大多数是输入法框架和Qt桥接没配对。麒麟系统常见fcitx和ibus两套框架,在启动脚本里显式指定:
export QT_IM_MODULE=fcitx如果用的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整个目录打包)
- 业务程序目录(程序+lib+plugins+run.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_OPENGL=software兜底;如果怀疑系统环境变量问题,就在脚本里把QT_QPA_PLATFORM_PLUGIN_PATH、LD_LIBRARY_PATH全部显式指到本地目录。
兜底做完了仍然不行,再考虑系统层面的问题,比如显示驱动、磁盘空间、交换分区。ARM64机器上交换分区不够,编译大工程或运行WebEngine程序时容易莫名崩溃,检查一下free -h和swapon --show,该扩就扩。
最后再说一个实际操作里的小习惯:拿到一台新的ARM64麒麟机器,第一件事是装好SSH、做好当前系统的快照或备份,再动手装依赖。因为这个平台的系统恢复成本明显高于x86台式机,很多现场事故都是装机阶段埋下的雷。备份不花多少时间,但能让你在折腾Qt 5.14.2时毫无顾虑,翻车了随时还原,重头再来。
本文还有配套的精品资源,点击获取