2

我使用 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

// 服务器接口.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 项目做这个。调试时它工作正常。我在开发过程中对插件部分进行了更改。

4

2 回答 2

3

QPluginLoader进行以下检查:

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

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

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

于 2014-10-11T09:39:27.220 回答
1

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

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

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

于 2016-03-16T17:04:13.017 回答