秋·风

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

lazarus鸿蒙开发3:编译libLazarusOHOS_Wrapper.so

注:引用了“极度”的说明文档。
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 

 

posted on 2026-06-03 12:48  秋·风  阅读(56)  评论(0)    收藏  举报