Pascal开发HarmonyOS鸿蒙PC应用(Lazarus-LCL-Qt5)
前言
分布式架构是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.
编译
- 项目选项 → 编译选项 → 目标和平台:
目标操作系统(-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等复杂业务系统。
更多推荐


所有评论(0)