我写了一个测试用的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)