前言

        分布式架构是OpenHarmony系统的核心特性,而在企业信息化领域,仍留存有大量基于 pascal 语言、依托RAD快速开发工具搭建的业务系统,其中以企业MIS(信息管理系统)、ERP(企业资源规划)等业务系统最为典型。RAD工具(如Lazarus)跨平台编译能力允许开发者使用单一代码库或高度复用的组件,生成适配不同OS和屏幕尺寸的应用。将这类存量Pascal业务系统快速迁移至OpenHarmony平台,能够大幅降低多端适配的开发成本、后期运维成本,对存量系统迭代升级、跨端生态拓展具备重要价值。

        桌面应用实现跨平台迁移的核心前提,是所使用的GUI图形库具备原生跨平台适配能力。Lazarus配套的LCL组件库支持多后端渲染模式,可适配:Win32/GDI(Windows)、GTK2/GTK3(Linux)、Cocoa(macOS)、Qt5/Qt6(全平台通用后端),但不同后端的跨端兼容性、OpenHarmony适配性差异极大,直接决定了存量系统迁移的难度与可行性,各后端适配特性具体如下:

  • Win32/GDI:仅 Windows,无任何移动端 / 鸿蒙适配;
  • GTK:GTK 对移动端、鸿蒙支持极差,无官方 QPA 类抽象,移植成本极高;
  • Cocoa:仅 macOS/iOS,完全不兼容鸿蒙;
  • Qt 框架内置的 QPA(Qt 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/​

        2:Qt 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-switch)

        3:编译支持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--sysroot=F:/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_SDK=F:/Huawei/DevEcoStudio/sdk/default/openharmony/native
SET TOOLCHAIN=F:/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_BIN=F:/Huawei/Qt-5.12.12-ohos-x86_64/bin
SET OHOS_TARGET_ARCH=x86_64
%QT_OHOS_BIN%\qmake.exe -o Makefile ..\Qt5Pas.pro -spec ohos-clang "CONFIG+=qml_debug"
mingw32-make -j8
copy /y libQt5Pas.so %QT_OHOS_BIN%

cd ..\arm64
SET QT_OHOS_BIN=F:/Huawei/Qt-5.12.12-ohos-arm64/bin
SET OHOS_TARGET_ARCH=arm64-v8a
%QT_OHOS_BIN%\qmake.exe -o Makefile ..\Qt5Pas.pro -spec ohos-clang "CONFIG+=qml_debug"
mingw32-make -j8
copy /y libQt5Pas.so %QT_OHOS_BIN%

        以上 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.

编译

  1. 项目选项 → 编译选项 → 目标和平台
    ​​​目标操作系统(-T)​​ 下拉列表中选择OHOS
    ​​​目标CPU架构(-P)​​ 下拉列表中选择x86_64aarch64
  2. 项目选项 → 当前LCL控件集配(LCLWidgetType):必须选择 “qt5”
  3. 其他:

                  不用勾选“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等复杂业务系统。

    Logo

    开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

    更多推荐