无法为模块 %modulename% 加载 QML 插件:无法从 %module.so% 中提取插件元数据

Gri*_*ief 5 qml qt5

我想编写 QML 插件来将一些类从 Qt 公开到 QML 层。我从这里跟随指南。这是代码:

暴露.pro

TEMPLATE = lib
CONFIG += qt plugin
QT += qml gui

DISTFILES += expose.json
DESTDIR = ../g/Expose
TARGET = expose
SOURCES += expose.cpp
Run Code Online (Sandbox Code Playgroud)

暴露.cpp

#include <QQmlExtensionPlugin>
#include <QQmlEngine>

#include <QGuiApplication>

class QGuiApplicationWrapper : public QGuiApplication {
    int argc;
public:
    QGuiApplicationWrapper() : QGuiApplication(argc, nullptr) {}
};

class QExampleQmlPlugin : public QQmlExtensionPlugin {
    Q_OBJECT
    Q_PLUGIN_METADATA(IID QQmlExtensionInterface_iid)
public:
    void registerTypes(const char *uri) {
        Q_ASSERT(uri == QLatin1String("g.Expose"));
        qmlRegisterType<QGuiApplicationWrapper>(uri, 1, 0, "GuiApplication");
    }
};
Run Code Online (Sandbox Code Playgroud)

但是当我尝试import g.Expose 1.0从 QML 进行操作时,出现以下错误:

plugin cannot be loaded for module "g.Expose": Failed to extract plugin meta data from 'g/Expose/libexpose.so

我查看了加载器的代码(qlibrary.cpp):

bool ret = false;

if (pos >= 0) {
    if (hasMetaData) {
        const char *data = filedata + pos;
        QJsonDocument doc = QLibraryPrivate::fromRawMetaData(data);
        lib->metaData = doc.object();
        if (qt_debug_component())
            qWarning("Found metadata in lib %s, metadata=\n%s\n",
                     library.toLocal8Bit().constData(), doc.toJson().constData());
        ret = !doc.isNull();
    }
}

if (!ret && lib)
    lib->errorString = QLibrary::tr("Failed to extract plugin meta data from '%1'").arg(library);
Run Code Online (Sandbox Code Playgroud)

所以我猜想必须提供一些 json 并在 in 中指定Q_PLUGIN_METADATA,但我在文档中找不到描述其格式和包含过程的位置