Qt for OpenHarmony源码编译问题总结
Qt 5.12.12 for HarmonyOS 编译问题总结
构建结果:
✓ 已成功完成构建与 install
- 产物根目录:D:\APP\QT\qt-5.12.12-ohos\
- 运行时库:lib/libQt5*.so
- OHOS 平台插件:plugins/platforms/libqohos.so
- host 工具:bin/qmake.exe / moc.exe / rcc.exe / uic.exe / openharmonydeployqt.exe 等
根本原因:
Qt 5.12.12 交叉编译使用 clang + -Werror,所有警告被当作硬错误。
Qt 5.x 的 OHOS 插件与新 SDK API 及 clang 严格性不兼容。
前置说明:
编译期问题之前,先有 4 个**配置期**问题需解决(详见 配置问题总结.txt):
1. qglobal.cpp 中 __EXCEPTIONS 宏未定义导致 <exception> 未被包含
2. win32-g++/qmake.conf 中的 -fno-keep-inline-dllexport 不被 clang 识别
3. g++ -print-search-dirs 输出含 ;; 连续双分号导致 qmake 解析失败(g++.bat 包装脚本处理)
4. g++ -E -v 输出缺少 LIBRARY_PATH= 行导致 qmake 解析失败(同上 g++.bat 包装脚本处理)
问题清单:
qtbase IBus 插件 - qibustypes.h - 类型未声明
Linux 输入法插件引用 QDBusArgument 但缺少头文件,HarmonyOS 无需此插件
解决:删除 ibus 源目录,生成空 Makefile 跳过编译
状态:未在本环境中执行(qtmultimedia 等下游模块也未依赖 ibus,构建顺利通过)
备注:本环境实际未触发此问题,可保留预案供以后清理时使用
qtbase DBus 模块 - qdbusreply.h - 拷贝构造函数被隐式删除
QDBusReply 拷贝构造函数因成员 QDBusPrivate 被显式 = delete,clang 严格性使其在 GCC 下能编译的代码暴露问题
解决:显式加上 inline QDBusReply(const QDBusReply &other) = default;
状态:未在本环境中执行(qtbase 构建顺利通过,未撞到此警告)
qtmultimedia OHOS 播放器 - qohosavplayer.cpp - switch 枚举未全覆盖
新 SDK 增加 AV_ERR_SUPER_RESOLUTION_UNSUPPORTED / AV_ERR_SUPER_RESOLUTION_NOT_ENABLED / AV_ERR_IO_CLEARTEXT_NOT_PERMITTED 等枚举值
解决:在 switch 的 } 前补上对应的 case 分支
状态:✅ 已处理(代码中 AV_ERR_SUPER_RESOLUTION_UNSUPPORTED 等已在 case 列表中,实际触发的是 switch 未列全其他枚举的报错)
qtmultimedia OHOS 摄像头 - qohoscameracommon.cpp - switch 枚举未全覆盖(3处)
新 SDK 新增 CAMERA_FORMAT_DNG / CAMERA_FORMAT_DNG_XDRAW / CAMERA_FORMAT_HEIC 等格式枚举,
以及 CAMERA_ERROR_OPTIONAL_PROPERTY_NOT_EXIST / CAMERA_ERROR_CAPABILITY_NOT_SUPPORTED 等错误枚举
解决:在 3 个 switch 的 } 前各加一个 default: 分支,把未知值兜底为
Format_Invalid / "<unknown error>" / "<unknown camera format>"
(实际采用 default 兜底而非逐个补 case,语义等价于原 fall-through 行为)
状态:✅ 已处理
qtmultimedia OHOS 图像 - qohosimagecommon.cpp - switch 枚举未全覆盖(1处)
新 SDK 新增 IMAGE_GET_IMAGE_DATA_FAILED / IMAGE_PIXELMAP_RELEASED / IMAGE_UNSUPPORTED_DATA_FORMAT 等 7 个枚举值
解决:在 switch 末尾(#endif 后)加 default: return "<unknown error>";
状态:✅ 已处理
qtmultimedia OHOS 音频通用 - qohosaudiocommon.cpp - switch 枚举未全覆盖(1处)
新 SDK 新增 AUDIOSTREAM_ERROR_UNSUPPORTED_ABILITY / AUDIOSTREAM_ERROR_SERVICE_DIED 等枚举值
解决:在 switch 末尾(#endif 后)加 default: return "<UNKNOWN>";
状态:✅ 已处理
qtmultimedia OHOS 音频设备 - qohosaudiodeviceinfo.cpp - switch 枚举未全覆盖(1处)
新 SDK 新增 AUDIOCOMMON_RESULT_ERROR_PERMISSION_DENIED / AUDIOCOMMON_RESULT_ERROR_FRAME_LENGTH_MISMATCH 等枚举值
解决:在 switch 末尾加 default: return "<UNKNOWN>";
状态:✅ 已处理
qtmultimedia OHOS 音频输出 - qohosaudiooutput.cpp - switch 枚举未全覆盖(1处)
新 SDK 新增 AUDIOSTREAM_USAGE_VOICE_ASSISTANT / AUDIOSTREAM_USAGE_AUDIOBOOK / AUDIOSTREAM_USAGE_NAVIGATION / AUDIOSTREAM_USAGE_VIDEO_COMMUNICATION 等枚举值
解决:在 switch 末尾加 default: return makeEmptyQOhosOptional();
状态:✅ 已处理
qtmultimedia OHOS 图像打包 - qohosimagepacker.cpp - switch 枚举未全覆盖(1处)
新 SDK 新增 QMultimedia:: 枚举值
解决:在 switch 末尾加 default: return 100;
状态:✅ 已处理
qtdeclarative (QtQml) - Python 缺失
QtQml 代码生成需要 python 解释器
解决:安装 Python 3.12.5,在 oh.bat 开头加 SET PATH=...Python312;%PATH%
状态:✅ 已处理
经验教训:
Qt 5.12.12 主要针对 GCC/MSVC,clang 的严格性(-Wswitch、-Wdeprecated-copy、隐式删除检测)会暴露很多原本只是警告的问题
-Werror 使任何小警告都能中止整个 build,且只有编译到对应 .obj 时才会暴露(编了大半天才撞上)
HarmonyOS SDK 迭代快,枚举不断新增,Qt 的 OHOS 插件需要持续同步
交叉编译时构建过程可能需要 host 工具(如 Python 生成代码)
补丁管理建议:
当前所有补丁均为手动改源码,重新解压源码包后会被覆盖。建议:
- 用 git init 把 tqtc-qt5/ 初始化为仓库,所有补丁通过 git diff 管理
- 或将每个补丁保存为 patches/ 下的独立 .patch 文件,重做环境时用 patch -p1 应用
- oh.bat 中修改的环境变量单独记录,不要混在源码补丁里
提速建议:
下次开局推荐在 QMAKE_CXXFLAGS 中加 -Wno-error=switch -Wno-error=deprecated-copy,
先编通拿到完整 Qt 库,最后再回头逐项清理被抑制的警告。
(注意:这只是加快迭代的临时手段,最终仍应消除每个警告根因。)
部署相关:
- 交叉编译 host 工具齐全:qmake / moc / rcc / uic / qmllint / openharmonydeployqt
- 后续推送到设备时使用 bin\openharmonydeployqt.exe
- 运行时需将 lib/、plugins/、qml/ 三目录打包到应用 hap 资源中
变更日志:
- 2026-09-17:完成完整 Qt 5.12.12 for HarmonyOS 构建,install 产物落地 D:\APP\QT\qt-5.12.12-ohos\
共处理 9 个 switch 枚举漏全 + 1 个 Python 环境配置补
配置过程看
Qt for OpenHarmony源码构建问题总结-CSDN博客
最后实在不行
链接: https://pan.baidu.com/s/1SYIG1IiT-HPC7-X4aUjFCw 提取码: 6ni5
下载下来把脚本运行一遍
更多推荐

所有评论(0)