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

无法为模块%modulename%加载QML插件:未能从%module提取插件元数据。so%,qml,qt5,Qml,Qt5,我想写QML插件来公开一些从Qt到QML层的类。我跟着导游走。代码如下: expose.pro TEMPLATE = lib CONFIG += qt plugin QT += qml gui DISTFILES += expose.json DESTDIR = ../g/Expose TARGET = expose SOURCES += expose.cpp expose.cpp #include <QQmlExtensionPlugin> #include <QQmlE

我想写QML插件来公开一些从Qt到QML层的类。我跟着导游走。代码如下:

expose.pro

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

DISTFILES += expose.json
DESTDIR = ../g/Expose
TARGET = expose
SOURCES += expose.cpp
expose.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");
    }
};

因此,我想必须在
Q_PLUGIN\u METADATA
中提供并指定一些json,但我在文档中找不到描述其格式和包含过程的位置,这很奇怪。说“文件是可选的,指向一个json文件”,所以你不应该提供它。@Mitch我认为它是可选的,因为你可以为自己的应用程序特定插件使用Qt插件机制,如果你不需要任何元数据,你就不必提供任何元数据。对于特定的插件感知子系统,例如QML@Grief与问题无关,但与您的代码无关:我不确定您是否可以从QML实例化Qt应用程序对象,它可能在创建QML引擎之前就已经是必需的了。你在这里的目标是什么?
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);