【问题标题】:Unable to load Qt Plugin无法加载 Qt 插件
【发布时间】:2014-10-11 07:13:55
【问题描述】:

我使用 Qt 5.3 和调用时

QPluginLoader pluginLoader(pluginsDir.absoluteFilePath(fileName));
bool pluginLoaded = pluginLoader.isLoaded();

它给出了错误:(

// serverplugin.h

    #ifndef SERVERPLUGIN_H
#define SERVERPLUGIN_H

#include <QObject>
#include <QtPlugin>
#include "acepos/aceclient/serverinterface.h"

#include <QThread>
#include "server.h"

class ServerPlugin : public QObject,
                     public ServerInterface
{
    Q_OBJECT
    Q_PLUGIN_METADATA(IID "org.qt-project.Qt.AcePos.ServerInterface/1.1" FILE "serverplugin.json")
    Q_INTERFACES(ServerInterface)
    QThread *m_pServerThread;
    Server *m_pServer;

public:
    ServerPlugin():m_pServerThread(NULL), m_pServer(NULL){}

private slots:
    //void handleServiceStartNotify();

public:
    bool startServerService();
    bool stopServerService();
};

#endif

// serverinterface.h

#ifndef SERVERINTERFACE_H
#define SERVERINTERFACE_H

#include <QtPlugin>

class ServerInterface
{
public:
    virtual ~ServerInterface() { }
    virtual bool startServerService() = 0;
    virtual bool stopServerService() = 0;
};

#define ServerInterface_iid "org.qt-project.Qt.AcePos.ServerInterface/1.1"

Q_DECLARE_INTERFACE(ServerInterface, ServerInterface_iid)

#endif // SERVERINTERFACE_H

如果我在创建插件时做错了什么,请告诉我。

当我构建插件项目时,我可以看到生成的库文件。我正在为 android qt 项目做这个。调试时它工作正常。我在开发过程中对插件部分进行了更改。

【问题讨论】:

  • errorString() 说什么?
  • errorString 说:“插件验证数据不匹配”
  • 在 windows 机器上即使 pluginloader 说假,我也能得到插件实例 QObject *plugin = pluginLoader.instance(); if (plugin) { qDebug()(plugin); if (NULL != m_pServerInterface) { qDebug()
  • 您确定在发布模式下您正在加载插件的发布版本吗? QPluginLoader 不会在发布模式下加载调试插件,反之亦然
  • 抱歉这个错误是在尝试加载.a文件但尝试加载.dll时出现void MainFrame::loadPlugin() fileName "serverplugind.dll" void MainFrame::loadPlugin() pluginLoaded false void MainFrame::loadPlugin() pluginLoaded "Unknown error"

标签: qt qt-necessitas


【解决方案1】:

QPluginLoader 进行以下检查:

  • 相同的构建配置(发布/调试,类 Unix 系统除外)
  • 相同的主要版本和次要/补丁版本等于或小于 Qt 的应用程序次要/补丁版本

开发人员有时会忘记使用正确的 Qt 配置重新构建插件,导致插件未加载。解决方案:使用正确的构建配置重新构建插件。

您还可以在应用程序的启动环境中设置QT_DEBUG_PLUGINS=1,以获取有关插件加载的更详细的调试信息。

【讨论】:

    【解决方案2】:

    我昨天偶然发现了这个问题,这是我解决它的方法: 请注意,我的插件和使用该插件的应用程序都处于调试模式并使用相同版本的 Qt 构建,所以这不是问题。问题是我忘记在插件的主要导出类中添加以下行:

    Q_PLUGIN_METADATA(IID "namespace.if.any.classname" FILE "package.json")
    

    在此之后我加载插件没有问题。

    【讨论】:

    • @Abin,我知道你知道。我只是决定发布这个答案,以防有人会因为与您相同的原因而面临同样的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-16
    • 2016-01-08
    • 2017-03-01
    • 2011-10-27
    • 1970-01-01
    相关资源
    最近更新 更多