整理一篇学习笔记,把看到的一些要点和自己的理解都记下来。
【开源软件移植】鸿蒙 PC:QElectroTech 从零编译到鸿蒙pc运行的 10 个阶段
把 KDE 系编辑器 QElectroTech 移植到鸿蒙 PC 的全流程实战记录。
欢迎加入开源鸿蒙 PC 社区:https://harmonypc.csdn.net/
要注意(本部分必看): 开始这篇这篇干活前需要完成: 从0创建项目指南,新手先看这篇,都写到这篇这篇内了,重复的步骤不过多重复写,后续干活都在用HAP 壳工程: https:// 准备 OpenHarmony SDK 准备 Qt for HarmonyOS 复现最小 Qt Widgets Demo 准备 DevEco HAP 壳工程
完成上面步骤,即可跟着这篇这篇进行手把手教学适配QElectroTech!
本项目源码开源:https://atomgit.com/weixin_52908342/OH-QElectroTech
新手必看前置步骤
从0创建项目指南,新手先看这篇:
https://)
QT官方鸿蒙版开源地址:[https://wiki.qt.io/Qt5.12.12_Open_Source_Release_for_HarmonyOS_zh
QT官方文档地址:https://wiki.qt.io/Qt_for_OpenHarmony/zh
环境要求
(HarmonyOS/OpenHarmony)鸿蒙版本 API20+
Qt Creator安装 安装电脑版Qt5.12或以上版本(5.14、5.15),获得QtCreator的IDE。
华为 DevEco Studio 安装 如果您想开发Qt for HarmonyOS应用程序,除了用Qt Creator之外,还需要依赖DevEco Studio。
准备 DevEco HAP 壳工程
这一步在 DevEco Studio 里做。
创建工程
在 DevEco Studio 中:
File
New
Create Project
选择一个最简单的 Stage 模板。工程名也能叫:
QtOhosDemo
目标结构大致类似:
QtOhosDemo/
entry/
src/main/
ets/
cpp/
libs/
如果你用的是 Qt for HarmonyOS 官方模板,里面通常已经有加载 Qt runtime 的代码。
设置加载库名
找到类似文件:
entry/src/main/ets/common/QtAppConstants.ets
设置:
export const APP_LIBRARY_NAME = 'libqt_ohos_demo.so';
如果你的模板没有这个文件,就搜索:
APP_LIBRARY_NAME
loadLibrary
libqohos
目标是让 HAP 启动时加载:
libqt_ohos_demo.so
放入动态库
创建目录:
entry/libs/arm64-v8a/
把下面文件放进去:
libqt_ohos_demo.so
libqohos.so
libQt6Core.so 或 libQt5Core.so
libQt6Gui.so 或 libQt5Gui.so
libQt6Widgets.so 或 libQt5Widgets.so
libqt_ohos_demo.so 来自:
~/qt-ohos-demo/build-ohos/libqt_ohos_demo.so
Qt runtime 的 .so 来自你的 Qt for HarmonyOS 安装目录。
签名 .so
在构建主机上签名:
export SIGN_TOOL=$OHOS_SDK_ROOT/toolchains/lib/binary-sign-tool
cd /path/to/QtOhosDemo/entry/libs/arm64-v8a
$SIGN_TOOL sign -inFile libqt_ohos_demo.so -outFile libqt_ohos_demo.so -selfSign 1
如果你自己拷贝了其他三方库 .so,也一起签名。
运行
在 DevEco Studio 中:
Sync Project
Build Hap
Run
成功标志:
鸿蒙 PC 上出现一个窗口,显示 Hello Qt on HarmonyOS PC
如果这里成功,说明:
Qt runtime 可以加载
HAP 壳工程可以运行
你的业务 .so 可以被鸿蒙应用加载
到这里就也能开始本章的QElectroTech 适配干活了。
0. 写在前面:为什么是 QElectroTech?
前两篇文章把 KDiff3 / glogg 这类"中等体量 Qt 应用"的鸿蒙 PC 移植套路打通了。这次我特意挑了一个有挑战性的:
QElectroTech(官网)是一款专门画电气原理图、机柜布局图、电力回路示意图的 Qt5 桌面应用,被法国国铁 SNCF、欧洲多家电力公司、教育部门长期用。它的工程量级在我看过的这一系列移植项目里属于最大:
维度数值顶层 .pro 文件1 个内嵌子模块 .pri5 个(PropertiesEditor / QetGraphicsItemModeler / QPropertyUndoCommand / SingleApplication / QWidgetAnimation)sources/ 子目录53 个.cpp + .h~ 600 个.ui 表单~ 60 个.qrc 资源1.7 万行Qt 模块xml / svg / network / sql / widgets / printsupport / concurrent + KF5(KWidgetsAddons + KCoreAddons)pkg-config 依赖sqlite3(直接调 C API:sqlite3_backup_)编译产物17 MB 的可加载 SO编译耗时clean build ~ 8 min(4 核)
挑这一个项目的目的,就是把"全 KF5 依赖 + 内嵌 sqlite3 C API + 多版本 moc 不兼容"这套硬骨头集中过一遍——以后再遇到任意一个 KDE 系 Qt 应用,这篇文章里的所有"招式"都也能拿来用。
1. 阶段 1:环境
[root@VM-0-13-opencloudos ~]# echo $QT_OHOS_ROOT
/opt/qt-ohos/qt-5.12.12-ohos/qt-5.12.12-ohos
[root@VM-0-13-opencloudos ~]# echo $OHOS_SDK_ROOT
/root/ohos-sdk/ohos-sdk/linux
[root@VM-0-13-opencloudos ~]# /root/ohos-sdk/ohos-sdk/linux/native/llvm/bin/aarch64-unknown-linux-ohos-clang --version | head -2
OHOS (dev) clang version 15.0.4 (llvm-project 283a25c11cd1d1ce321874382db5331f474ff5da)
Target: aarch64-unknown-linux-ohos
[root@VM-0-13-opencloudos ~]# ls -la /opt/qt-ohos/qt-5.12.12-ohos/qt-5.12.12-ohos/bin/qmake.exe
lrwxrwxrwx 1 root root 24 May 23 21:35 /opt/qt-ohos/qt-5.12.12-ohos/qt-5.12.12-ohos/bin/qmake.exe -> /usr/lib64/qt5/bin/qmake
[root@VM-0-13-opencloudos ~]# rpm -qa | grep -i qt5 | head
qt5-qtbase-5.15.11-11.oc9.x86_64
qt5-qtbase-gui-5.15.11-11.oc9.x86_64
qt5-qtsvg-5.15.11-3.oc9.x86_64 ← 本次新装(QET 用 SVG)
qt5-qtsvg-devel-5.15.11-3.oc9.x86_64 ← 本次新装
[root@VM-0-13-opencloudos ~]# mkdir -p /root/QElectroTechGOGO/src && cd /root/QElectroTechGOGO/src
环境差异点:QElectroTech 的 QT += xml svg ... 触发 host qmake 解析 module_qt_svg.pri,于是本次比 glogg 多装一个 qt5-qtsvg-devel。
2. 阶段 2:下载源码 + 补齐子模块
QElectroTech 的官方主仓在 framagit,GitHub 镜像在 qelectrotech/qelectrotech-source-mirror。关键坑点:tarball 不带 git submodule,源码包解压后 pugixml/、SingleApplication/、elements/、doxygen-awesome-css/ 都是空目录。
# 1) 主源码包(GitHub 镜像)
[root@... src]# curl -sSLo qelectrotech-source-mirror-master.tar.gz \
https://github.com/qelectrotech/qelectrotech-source-mirror/archive/refs/heads/master.tar.gz
[root@... src]# tar -xzf qelectrotech-source-mirror-master.tar.gz
[root@... src]# cd qelectrotech-source-mirror-master
[root@... qelectrotech-source-mirror-master]# ls -la SingleApplication/ pugixml/
total 4
drwxrwxr-x 2 root root 6 May 24 01:28 SingleApplication/ ← 空目录
drwxrwxr-x 2 root root 6 May 24 01:28 pugixml/ ← 空目录
# 2) 单独 clone 两个子模块
[root@... qelectrotech-source-mirror-master]# git clone --depth 1 https://github.com/itay-grudev/SingleApplication.git
[root@... qelectrotech-source-mirror-master]# git clone --depth 1 https://github.com/zeux/pugixml.git
[root@... qelectrotech-source-mirror-master]# ls SingleApplication/*.pri pugixml/src/*.cpp
SingleApplication/singleapplication.pri
pugixml/src/pugixml.cpp ✓ 子模块就位
elements/(电气元件库)和 doxygen-awesome-css/ 这两个对编译不影响(前者是运行期的资源,后者只用来生成 doxygen 文档),跳过。
源码量级体感:
[root@... qelectrotech-source-mirror-master]# find sources -name '*.cpp' -o -name '*.h' | wc -l
604
[root@... qelectrotech-source-mirror-master]# wc -l qelectrotech.pro
345 qelectrotech.pro
[root@... qelectrotech-source-mirror-master]# du -sh sources/
24M sources/
3. 阶段 3:源码分析 —— 锁定三块硬骨头
我先扫了一遍上游 .pro 和源码,找出"鸿蒙工具链做不到"的部分。结论是这三块:
硬骨头 1:KDE Frameworks 5(KWidgetsAddons + KCoreAddons)
[root@... qelectrotech-source-mirror-master]# grep -n 'KWidgetsAddons\|KCoreAddons' qelectrotech.pro
233:QT += xml svg network sql widgets printsupport concurrent KWidgetsAddons KCoreAddons
KF5 不在 Qt-OHOS 工具链里(也没必要为这一个项目交叉编译整个 KF5,工作量爆炸)。好消息——QElectroTech 上游早已设计了 BUILD_WITHOUT_KF5 编译宏,对所有 KF5 类的 #include 都有 #ifdef 保护:
// sources/qetapp.cpp:51
#ifdef BUILD_WITHOUT_KF5
#else
# include
#endif
// sources/editor/ui/texteditor.h:30
#ifdef BUILD_WITHOUT_KF5
#else
#include
#endif
坏消息——.ui 文件的 promoted widget 没法被 #ifdef 保护:
KColorButton
QPushButton
kcolorbutton.h
uic 会无条件生成 #include "kcolorbutton.h" 进 ui_*.h。这条线必须给一个最小可用的 shim 头文件让编译过去(详见 §5)。
硬骨头 2:sqlite3 C API(PKGCONFIG += sqlite3)
```
[root@... qelectrotech-source-mirror-master]# grep -rn '#include\s
以上就是这次整理的全部内容,希望对你有所启发。如果有不同见解,欢迎在评论区交流讨论。
评论 (0)
暂无评论