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

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 T qobject_cast(QObject
)
inline T qobject_cast(QObject *object)

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

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

    悬赏问题

    • ¥15 Stata 面板数据模型选择
    • ¥20 idea运行测试代码报错问题
    • ¥15 网络监控:网络故障告警通知
    • ¥15 django项目运行报编码错误
    • ¥15 请问这个是什么意思?
    • ¥15 STM32驱动继电器
    • ¥15 Windows server update services
    • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏
    • ¥15 模糊pid与pid仿真结果几乎一样
    • ¥15 java的GUI的运用