前言分布式架构是OpenHarmony系统的核心特性而在企业信息化领域仍留存有大量基于 pascal 语言、依托RAD快速开发工具搭建的业务系统其中以企业MIS信息管理系统、ERP企业资源规划等业务系统最为典型。RAD工具如Lazarus跨平台编译能力允许开发者使用单一代码库或高度复用的组件生成适配不同OS和屏幕尺寸的应用。将这类存量Pascal业务系统快速迁移至OpenHarmony平台能够大幅降低多端适配的开发成本、后期运维成本对存量系统迭代升级、跨端生态拓展具备重要价值。桌面应用实现跨平台迁移的核心前提是所使用的GUI图形库具备原生跨平台适配能力。Lazarus配套的LCL组件库支持多后端渲染模式可适配Win32/GDIWindows、GTK2/GTK3Linux、CocoamacOS、Qt5/Qt6全平台通用后端但不同后端的跨端兼容性、OpenHarmony适配性差异极大直接决定了存量系统迁移的难度与可行性各后端适配特性具体如下Win32/GDI仅 Windows无任何移动端 / 鸿蒙适配GTKGTK 对移动端、鸿蒙支持极差无官方 QPA 类抽象移植成本极高Cocoa仅 macOS/iOS完全不兼容鸿蒙Qt 框架内置的 QPAQt Platform Abstraction平台抽象层是实现Lazarus应用向OpenHarmony迁移的核心技术桥梁这也是LCL组件库无法直接适配鸿蒙、必须依托Qt框架的核心原因。Qt 自身通过 QPA 隔离操作系统窗口系统Windows、X11/Linux、macOS、Android、HarmonyOS、WebAssembly 都各自对应一套 QPA 平台插件。 Lazarus 选用 Qt WidgetSet 后整个 GUI 渲染全部交给 Qt移植目标平台只需要让 Qt 能在该系统编译运行LCL 层无需额外适配。目前Qt框架已完成对OpenHarmony的全面适配生态成熟、适配稳定。Qt WidgetSet QPA是 Lazarus 向鸿蒙迁移的最优方案。Lazarus 移植 HarmonyOS 的完整逻辑链你的Lazarus业务代码 → LCL-Qt5工程(.so) → QPA鸿蒙平台插件 → HarmonyOS一、环境准备1华为 DevEco Studio 安装华为官网下载安装DevEco Studio注意安装时指定的安装路径中不要包括空格​​https://developer.huawei.com/consumer/cn/deveco-studio/​​2Qt for HarmonyOS(a). QT官网下载Qt for HarmonyOS 源代码​​https://wiki.qt.io/Qt5.12.12_Open_Source_Release_for_HarmonyOS_zh​​(b). 在 Windows 中为 HarmonyOS 构建 Qt 库注意目录路径须使用/分隔​​​​https://wiki.qt.io/Qt_for_OpenHarmony/zh​​PS配置成功后使用 mingw32-make 进行install构建前参考 ​​HarmonyOS鸿蒙PC的QT应用开发​​ 文档中的说明来修正 qtmultimedia\src\plugins\ohos\src 下的 makefile 文件。修改 CXXFLAGS … -Werror -Wall -Wno-switch 去掉 -Werror 添加 -Wno-switch3编译支持HarmonyOS系统的fpc和lazarus下载 ​​ohos_lazarus48_fpc331.rar​​​ 解压到本地磁盘根目录编辑lazarus48_fpc331目录下的 Build.bat 文件将NATIVE_OHOS_SDK路径设为第1步安装到本地电脑的 HarmonyOS SDK native 目录。执行 Build.bat 编译(最好是以管理员身份)该过程可能需要花费较长时间。看到 ok 出现交叉编译完成支持 ohos-x86_64/aarch64 两种主流CPU。桌面自动生成了 “OHOS-Lazarus4.8” 的快捷方式。4为 fpc 配置 ohos 适配路径在 lazarus48_fpc331/fpc/bin/x86_64-win64/fpc.cfg 末尾添加#IFDEF ohos -k-LF:/Huawei/DevEcoStudio/sdk/default/openharmony/native/sysroot/usr/lib -k--sysrootF:/Huawei/DevEcoStudio/sdk/default/openharmony/native/sysroot #IFDEF CPUX86_64 -FlF:/Qt/Qt-5.12.12-ohos-x86_64/lib -FlF:/Huawei/DevEcoStudio/sdk/default/openharmony/native/sysroot/usr/lib/x86_64-linux-ohos -k-LF:/Qt/Qt-5.12.12-ohos-x86_64/lib #ENDIF #IFDEF CPUAARCH64 -FlF:/Qt/Qt-5.12.12-ohos-arm64/lib -FlF:/Huawei/DevEcoStudio/sdk/default/openharmony/native/sysroot/usr/lib/aarch64-linux-ohos -k-LF:/Qt/Qt-5.12.12-ohos-arm64/lib #ENDIF #ENDIF注意修改以上路径为本地安装鸿蒙SDK及Qt for HarmonyOS的输出路径。二、构建 Lazarus-LCL-Qt5 鸿蒙应用1编译 libQt5Pas.so 接口库进入 lazarus48_fpc331\lazarus\lcl\interfaces\qt5\cbindings 目录执行SET NATIVE_OHOS_SDKF:/Huawei/DevEcoStudio/sdk/default/openharmony/native SET TOOLCHAINF:/Huawei/DevEcoStudio/sdk/default/openharmony/native/llvm/bin SET PATH%TOOLCHAIN%;D:\Qt\Qt5.12.12\Tools\mingw730_64\bin;%PATH% mkdir x86_64 arm64 cd x86_64 SET QT_OHOS_BINF:/Huawei/Qt-5.12.12-ohos-x86_64/bin SET OHOS_TARGET_ARCHx86_64 %QT_OHOS_BIN%\qmake.exe -o Makefile ..\Qt5Pas.pro -spec ohos-clang CONFIGqml_debug mingw32-make -j8 copy /y libQt5Pas.so %QT_OHOS_BIN%/../lib cd ..\arm64 SET QT_OHOS_BINF:/Huawei/Qt-5.12.12-ohos-arm64/bin SET OHOS_TARGET_ARCHarm64-v8a %QT_OHOS_BIN%\qmake.exe -o Makefile ..\Qt5Pas.pro -spec ohos-clang CONFIGqml_debug mingw32-make -j8 copy /y libQt5Pas.so %QT_OHOS_BIN%/../lib以上 NATIVE_OHOS_SDK、TOOLCHAIN、QT_OHOS_BIN 分别要修改为本机安装的鸿蒙SDK/TOOLCHAIN目录、Qt for HarmonyOS 编译输出目录 。在x86_64和arm64目录分别是支持这两种CPU的 ​​libQt5Pas.so​​ 编译输出文件。为了以后Lazarus 编译方便这里将编译出的 libQt5Pas.so 文件分别复制到 Qt for HarmonyOS 输出的 lib 目录下与 libQt5Core.so 它们放一起。2编译 Lazarus 应用复制原lazarus的工程文件为 RunLazarus.lpr修改其内容为library RunLazarus; {$mode objfpc}{$H} {$longstrings on} uses {$IFDEF UNIX} cthreads, {$ENDIF} {$IFDEF HASAMIGA} athreads, {$ENDIF} Classes, forms, Interfaces, uMainForm; function main(argc: Integer; argv: PPChar): Integer; cdecl; export; begin Application.Scaled : True; Application.Initialize; Application.CreateForm(TMainWin, MainWin); MainWin.Show; Application.Run; Result : 0; end; exports main; begin end.编译项目选项 → 编译选项 → 目标和平台​​​目标操作系统(-T)​​ 下拉列表中选择OHOS​​​目标CPU架构(-P)​​ 下拉列表中选择x86_64或aarch64项目选项 → 当前LCL控件集配(LCLWidgetType)必须选择 “qt5”其他不用勾选“Win32图形界面应用程序(-WG)”切换编译的OS或CPU后首次需执行“清理和构建...”完成以上设置即可编译出支持 HarmonyOS 的二进制(.so)库文件。三、基于DevEco Studio构建鸿蒙HAP应用1下载 Qt 应用程序的 DevEco 项目模板获取Qt应用模板:​​http://codereview.qtcompany.cn:29416/template/​​解压应用模板到本地文件夹。2复制库文件转到上一步解压的文件夹中的\entry目录并创建子文件夹 \entry\libs\x86_64​将 Qt for HarmonyOS 输出路径的 lib 目录中的 ​​libQt5Pas.so​​​ , ​​libQt5Core.so​​​ ,​​ libQt5Gui.so​​​ ,​​ libQt5Network.so​​​ , ​​libQt5PrintSupport.so​​​ ,​​ libQt5Widgets.so​​ 复制进 x86_64 文件夹。将 Qt for HarmonyOS 输出路径的 plugins\platforms 目录中的 ​​libqohos.so​​ 复制进 x86_64 文件夹。将 Lazarus 编译输出的 ​​libRunLazarus.so​​ 复制进 x86_64 文件夹。3编辑 HAP 应用​打开文件 ​​deveco-project\entry\src\main\ets\common\QtAppConstants.ets​​修改 APP_LIBRARY_NAME 的应用库名为 Lazarus 的编译产物export const APP_LIBRARY_NAME libRunLazarus.so;4构建运行添加签名配置打开 file–project structure–signing configs勾选“自动生成签名文件”点击OK。(测试期间可以使用自动签名)在 DevEco Studio 中选择设备后可以直接构建并运行应用程序。下载到本地的模拟器只能测试x86_64的应用。若是用 arm 的真机设备进行测试注意目录应是 arm64-v8a 同时要使用对应的.so库。四、核心要点总结原理层面依靠Qt QPA抽象层隔离系统差异LCL无需底层改造编译层面Lazarus必须指定OHOS目标系统qt5控件集导出Cdecl标准入口函数工程层面Qt 5.12.12鸿蒙开源版生态成熟依托官方Qt DevEco模板完美支持依赖库。结语除了Qt官网发布的QPA插件还有开原鸿蒙SIG组织下也有类似的插件插件名为 libplugins_platforms_qopenharmony.so 原理功能都类似版本是5.15.12。除了Qt还有 SDL2/3 的方案也是可行的但相对企业应用来说比较小众特点是编译产物体积更小、轻量化缺点是企业级UI控件生态匮乏、无成熟组件库支撑仅适合轻量化工具类应用不大适合MIS、ERP等复杂业务系统。