Qt无法加载插件:未定义的符号iPlugin::staticMetaObject



我正在尝试在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个小时,我快疯了。

提前感谢

编辑:我在Qt5上移动,在类声明中使用Q_PLUGIN_METADATA(IID"Project.plug_text"),并删除cpp文件的Q_EXPORT_PLUGIN2(plug_text,TextPlugin)

第2版:我忘记了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;
}

好的,我发现了问题,我的坏。对于那些有这个问题的人:我在插件的.pro文件中有一行INCLUDEDIR,我已经删除了它,现在,插件工作得很好。

最新更新