码路上的江小白 2021-09-11 16:23 采纳率: 0%
浏览 17
已结题

QT的QPluginLoader无法加载多个插件

我写了一个测试用的demo,其中实现了两个简单插件(动态库),然后对QPluginLoader封装了一层,但是当我在main.cpp中同时加载两个插件,就会提示我第二个插件“未声明”,如果单独加载一个插件(无论是单独加载插件1还是插件2),程序可以成功运行,不清楚原因为何!

插件1接口定义:

class PLUGIN_API TestPluginInterface1
{
public:
    virtual QString uniId()         = 0;
    virtual QString name()          = 0;
    virtual QString description()   = 0;

    virtual QWidget * centerWidget() = 0;

    virtual ~TestPluginInterface1() {}
};

#define TESTPLUGININTERFACE_iid1 "com.Plugin.TestPluginInterface1"
Q_DECLARE_INTERFACE(TestPluginInterface1, TESTPLUGININTERFACE_iid1)

插件1实现:

class TestPluginInstance1 : public QObject, public TestPluginInterface1
{
    Q_OBJECT
    Q_INTERFACES(TestPluginInterface1)
    Q_PLUGIN_METADATA(IID TESTPLUGININTERFACE_iid1)

public:
    TestPluginInstance1();
    virtual ~TestPluginInstance1();

    virtual QString uniId() override;
    virtual QString name()  override;
    virtual QString description() override;

    virtual QWidget * centerWidget() override;
};

// 省略构造析构

QString TestPluginInstance1::name()
{
    return "First";
}

QString TestPluginInstance1::description()
{

}

QWidget * TestPluginInstance1::centerWidget()
{
    auto btn = new QPushButton("First");
    return btn;
}

接口2定义:

class PLUGIN_API TestPluginInterface2
{
public:
    virtual QString uniId()         = 0;
    virtual QString name()          = 0;

    virtual QWidget * centerWidget() = 0;

    virtual ~TestPluginInterface2() {}
};

#define TESTPLUGININTERFACE_iid2 "com.Plugin.TestPluginInterface2"
Q_DECLARE_INTERFACE(TestPluginInterface2, TESTPLUGININTERFACE_iid2)

接口2 的实现省略,其实和接口1实现差不多,就少了description()函数。

main.cpp代码:

#include "pluginsmanager.h"
#include "testplugin_interface1.h"
#include "testplugin_interface2.h"

#include <QApplication>
#include <QMainWindow>
#include <QHBoxLayout>
#include <QDebug>
#include <QString>

#define PLUGINDIR "/home/workspace/git/cppcode/qt/build-qt_plugin-qt5_9_3_shared-Debug/plugins"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    PluginsManager *pManager = new PluginsManager();

    QMainWindow mainWin;

    if (!pManager->load(PLUGINDIR))
    {
        qDebug() << "load all plugin failed";
        delete pManager;
        return 0;
    }

    auto i1 = qobject_cast<TestPluginInterface1 *>(pManager->getPlugin("libtestplugin1d.so"));
    **auto i2 = qobject_cast<TestPluginInterface2 *>(pManager->getPlugin("libtestplugin2d.so"));** // 这里会提示TESTPluginInterface2 not declare

    if (i1 == nullptr)
    {
        qDebug() << "load i1 plugin failed, is null";
        delete pManager;
        return 0;
    }

    i1->name();
    layout.addWidget(i1->centerWidget());

    if (i2 == nullptr)
    {
        delete pManager;
        return 0;
    }

    // mainWin.layout()->addWidget(i1->centerWidget());
    mainWin.layout()->addWidget(i2->centerWidget());
    mainWin.show();

    return a.exec();
}

贴不了图,错误信息如下:

../../qt_plugin/plugin_manager/main.cpp: In function ‘int main(int, char**)’:
../../qt_plugin/plugin_manager/main.cpp:29:28: error: ‘TestPluginInterface2’ was not declared in this scope
     auto i2 = qobject_cast<TestPluginInterface2 *>(pManager->getPlugin("libtestplugin2d.so"));
                            ^
../../qt_plugin/plugin_manager/main.cpp:29:15: error: parse error in template argument list
     auto i2 = qobject_cast<TestPluginInterface2 *>(pManager->getPlugin("libtestplugin2d.so"));
               ^
../../qt_plugin/plugin_manager/main.cpp:29:93: error: no matching function for call to ‘qobject_cast(QObject*)’
     auto i2 = qobject_cast<TestPluginInterface2 *>(pManager->getPlugin("libtestplugin2d.so"));
                                                                                             ^
../../qt_plugin/plugin_manager/main.cpp:29:93: note: candidates are:
In file included from /opt/Qt5.9.3.shared.set2/include/QtCore/QObject:1:0,
                 from ../../qt_plugin/plugin_manager/src/pluginsmanager.h:4,
                 from ../../qt_plugin/plugin_manager/main.cpp:1:
/opt/Qt5.9.3.shared.set2/include/QtCore/qobject.h:509:10: note: template<class T> T qobject_cast(QObject*)
 inline T qobject_cast(QObject *object)
  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 9月19日
    • 创建了问题 9月11日

    悬赏问题

    • ¥15 三菱伺服电机按启动按钮有使能但不动作
    • ¥20 为什么我写出来的绘图程序是这样的,有没有lao哥改一下
    • ¥15 js,页面2返回页面1时定位进入的设备
    • ¥200 关于#c++#的问题,请各位专家解答!网站的邀请码
    • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
    • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
    • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
    • ¥20 腾讯企业邮箱邮件可以恢复么
    • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
    • ¥15 错误 LNK2001 无法解析的外部符号