惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

The GitHub Blog
The GitHub Blog
有赞技术团队
有赞技术团队
Apple Machine Learning Research
Apple Machine Learning Research
V
V2EX
Engineering at Meta
Engineering at Meta
美团技术团队
H
Hackread – Cybersecurity News, Data Breaches, AI and More
博客园 - 司徒正美
I
InfoQ
S
SegmentFault 最新的问题
博客园 - 叶小钗
N
Netflix TechBlog - Medium
Y
Y Combinator Blog
IT之家
IT之家
博客园 - Franky
大猫的无限游戏
大猫的无限游戏
人人都是产品经理
人人都是产品经理
T
The Blog of Author Tim Ferriss
月光博客
月光博客
The Cloudflare Blog
U
Unit 42
GbyAI
GbyAI
L
LangChain Blog
Microsoft Azure Blog
Microsoft Azure Blog

博客园 - 秋·风

用lazarus编写的linux deb和windows打包工具源码已上传 修复lazarus datetimepicker控件在linux下拉不能选择日期的bug 用fpc trunk编译lazarus控件找不到TTimeZone 在银河麒麟v10操作系统应用程序执行遇到“权限不够”的提示 修复pl_cindy的Panel系列控件在gtk3出错的bug 龙芯 3A4000工具链的编译(mingw64) lazarus 4.8及之前的版本QT5中文输入多字词组时只输入前2个中文 修正lazarus在GTK3下的Synedit只能输入2个中文字符的Bug lazarus trunk linux从2026.07.02开始,LCLWidgetType默认使用gtk3,怎样改回gtk2 【aarch64-win64】DonAlfredo终于修复fpc将TSmallPoint赋值为一个负数,并将TSmallPoint赋值给TPoint时得到一个655xx的数值的bug lazarus编译时提示链接出错的处理方法 mORMot2两个BUG 【aarch64-win64】发现fpc aarch64-win64 将TSmallPoint赋值为一个负数,并赋值给TPoint时得到一个655xx的数值的bug 修复aarch64 win64下lazarus不弹出SourceTabPopUpMenu fpc aarch64-win64版编译应用时遇到一个奇怪的bug 在windows 11 on arm64系统编译lazarus出错的处理方法 修复TDBMemo只读不能使用Ctrl+C复制文字的Bug freepascal打补丁后已支持windows 11 on arm64(lazarus aarch64 windows版也可以运行了) 查看libc.so.6的版本号 Lazarus移动版启动程序 fpc 3.2.2交叉编译i386-linux链接出错 lazarus鸿蒙开发13:使用鸿蒙原生API画图--lazarus侧关键代码 lazarus鸿蒙开发12:使用鸿蒙原生API画图--鸿蒙侧关键代码 lazarus鸿蒙开发11:使用鸿蒙原生接口画图 lazarus鸿蒙开发10:lazarus一键编译、打包助手 lazarus鸿蒙开发9:使用命令行编译DevEco Studio应用 lazarus鸿蒙开发8:在DevEco Studio的日志窗口显示日志信息 lazarus鸿蒙开发7:在 Windows 上为 OpenHarmony (LoongArch64) 编译 Qt 5.15.12 SDK 指南 lazarus鸿蒙开发6:鸿蒙project配置 lazarus鸿蒙开发5:编译ohos_hap_project
lazarus鸿蒙开发3:编译libLazarusOHOS_Wrapper.so
秋·风 · 2026-06-03 · via 博客园 - 秋·风

注:引用了“极度”的说明文档。
Qt for HarmonyOS 通过其 ohos-clang QPA 插件,将 Qt 的窗口系统与鸿蒙的 ArkUI 进行了深度适配,为上层应用提供了成熟的 UI 渲染与事件处理通道。
基于Qt for harmonyOS 让 Lazarus 的 LCL-Qt5 程序,通过 libQt5Pas.so(桥接库)也能间接调用 Qt5 的原生库(libQt5Widgets.dll 等)。
libLazarusOHOS_Wrapper.so 是一个 C++ Qt 桥接库,作用:
1. 创建 QApplication(OHOS 不会自动创建,必须由应用自己创建)
2. 加载并调用 Pascal 库(`libOHOS_QT_Lazarus.so` 的 `InitAndShowForm`)
3. 运行 Qt 事件循环:application.run()

libLazarusOHOS_Wrapper.cpp源码:

// libLazarusOHOS_Wrapper.cpp - HarmonyOS Qt5 + Lazarus LCL wrapper
// QApplication is already created by Qt OHOS plugin (libqohos.so)
// before this library is loaded. Do NOT create another one.

#include <QApplication>
#include <dlfcn.h>

typedef void (*InitAndShowFormFunc)();

extern "C" int main(int, char**)
{
    // QApplication already exists from libqohos.so, do NOT create one.
    // Load the Lazarus library and find InitAndShowForm symbol.
    void* lib = dlopen("libOHOS_QT_Lazarus.so", RTLD_NOW | RTLD_GLOBAL);
    if (!lib)
        return 1;
    InitAndShowFormFunc InitAndShowForm = (InitAndShowFormFunc)dlsym(lib, "InitAndShowForm");
    if (!InitAndShowForm)
        return 1;
    InitAndShowForm();
    return 0;
}

结构:

libLazarusOHOS_Wrapper.so (C++)
├── main()
│ ├── QApplication app(argc, argv) // 1. 创建 Qt 应用
│ └── InitAndShowForm() // 2. 调用 Pascal 端创建/显示窗口,进入 Qt 事件循环
│
libOHOS_QT_Lazarus.so (Pascal/LCL)
└── InitAndShowForm()
├── Application.Initialize // 复用已存在的 QApplication
├── CreateForm + Show
└── ProcessMessages 循环 // 事件处理

没有libLazarusOHOS_Wrapper.so,OHOS 上没有 `QApplication`,LCL Qt5 接口无法初始化,窗口无法显示。

执行下列指令编译libLazarusOHOS_Wrapper.so

SET NATIVE_OHOS_SDK=d:/fpc4ohos/sdk/default/openharmony/native
SET SYSROOT=%NATIVE_OHOS_SDK%/sysroot
SET QT5DIR=d:/oh/Qt-5.12.12-ohos-aarch64


%NATIVE_OHOS_SDK%/llvm/bin/clang++ -shared ^
  -o libLazarusOHOS_Wrapper.so ^
  -I"%QT5DIR%\include" ^
  -I%QT5DIR%\include\QtWidgets ^
  -I%QT5DIR%\include\QtGui ^
  -I%QT5DIR%\include\QtCore ^
  -L"%SYSROOT%/usr/lib/x86_64-linux-ohos" ^
  -lc -ldl ^
  --sysroot="%SYSROOT%" -target x86_64-linux-ohos -fPIC ^
  libLazarusOHOS_Wrapper.cpp