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

推荐订阅源

Google DeepMind News
Google DeepMind News
爱范儿
爱范儿
J
Java Code Geeks
L
LangChain Blog
V
V2EX
大猫的无限游戏
大猫的无限游戏
S
SegmentFault 最新的问题
博客园 - Franky
Microsoft Azure Blog
Microsoft Azure Blog
Jina AI
Jina AI
Blog — PlanetScale
Blog — PlanetScale
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
The Cloudflare Blog
博客园 - 司徒正美
B
Blog
G
Google Developers Blog
Stack Overflow Blog
Stack Overflow Blog
罗磊的独立博客
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Apple Machine Learning Research
Apple Machine Learning Research
Engineering at Meta
Engineering at Meta
MyScale Blog
MyScale Blog
有赞技术团队
有赞技术团队
Hugging Face - Blog
Hugging Face - 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