我正在尝试在我的qt程序中使用插件系统。
即使我认为我的代码很好,我仍然在主程序中出现链接错误。 我正在使用 QPluginLoader 来加载插件。方法实例化返回空指针,错误字符串为:
Cannot load library *library* : (*library*: undefined symbol: _ZN7iPlugin16staticMetaObjectE)
这是iPlugin.h的接口:
#ifndef IPLUGIN_H
#define IPLUGIN_H
#include <QObject>
#include <QtPlugin>
class QWidget;
class iPlugin : public QObject
{
Q_OBJECT
public:
virtual ~iPlugin() {}
virtual const QString &getName() const = 0;
virtual QWidget *onStart() = 0;
public slots:
virtual void onMenu() = 0;
};
Q_DECLARE_INTERFACE(iPlugin, "Project.iPlugin")
#endif // IPLUGIN_H
插件文件textplugin.h
#ifndef TEXTPLUGIN_H
#define TEXTPLUGIN_H
#include <QObject>
#include "iplugin.h"
class QString;
class TextPlugin : public iPlugin
{
Q_OBJECT
Q_INTERFACES(iPlugin)
public:
TextPlugin();
virtual ~TextPlugin();
const QString &getName() const;
QWidget *onStart();
public slots:
void onMenu();
private:
const QString _name;
};
#endif // TEXTPLUGIN_H
插件文件textplugin.cpp:
#include <QString>
#include "textplugin.h"
#include "textwidget.h"
#include <iostream>
TextPlugin::TextPlugin() :
_name("text")
{
std::cout << "Hello" << std::endl;
}
TextPlugin::~TextPlugin()
{
}
const QString &TextPlugin::getName() const
{
return (this->_name);
}
QWidget *TextPlugin::onStart()
{
return (new TextWidget);
}
void TextPlugin::onMenu()
{
}
Q_EXPORT_PLUGIN2(plug_text, TextPlugin)
有没有人有想法? 我坚持了大约6个小时,我疯了。
提前致谢
编辑:我在我的班级声明中使用 Q_PLUGIN_METADATA(IID“Project.plug_text”)移动了Qt5并删除了cpp文件的 Q_EXPORT_PLUGIN2(plug_text,TextPlugin)但没有任何改变,错误是一样的。
EDIT2:我忘记了 QPluginLoader 代码,这里是:
QPluginLoader loader("/home/bambou/build-TestPlugin-Desktop-Debug/plugin/libplug_text.so");
if (QObject *obj = loader.instance()) {
std::cout << "hello !" << std::endl;
iPlugin *plugin = qobject_cast<iPlugin *>(obj);
this->registerPlugin(file, plugin);
} else {
std::cout << loader.errorString().toStdString() << std::endl;
}
答案 0 :(得分:0)
好的,我发现了问题,我的不好。 对于那些有这个问题的人:我在我的插件的.pro文件中有一个INCLUDEDIR行,我删除了它,现在,该插件运行良好。