【问题标题】:Qt Cannot load plugin : undefined symbol iPlugin::staticMetaObjectQt 无法加载插件:未定义的符号 iPlugin::staticMetaObject
【发布时间】:2014-11-01 15:19:10
【问题描述】:

我正在尝试在我的 qt 程序中添加一个插件系统。

即使我认为我的代码很好,我仍然在主程序中出现链接错误。 我正在使用 QPluginLoader 来加载插件。 instantiate 方法返回一个空指针,错误字符串为:

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)但什么都没有改变,错误是一样的。

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;
}

【问题讨论】:

  • 好吧,如果没有看到重现问题的代码,包括 QPluginLoader,真的很难说。
  • 您仍然隐藏"*absolute path to the lib, for debugging purposes*"等重要细节,请不要混淆这些。
  • 我已经添加了路径。
  • 您是否使用 QLibary::isLibrary() 验证了路径?此外,errorString() 不可能根据其源代码返回您正在编写的内容。你能发布一个重现错误的自编译示例吗?
  • 我已经用 QLibrary::isLibrary 验证了路径,它返回 true。您对“自编译示例”有何期望? errorString 返回完全相同的字符串,我只是混淆了路径,确切的值是:无法加载库/home/bambou/build-TestPlugin-Desktop-Debug/plugin/libplug_text.so: (/home/bambou/build-TestPlugin -Desktop-Debug/plugin/libplug_text.so:未定义符号:_ZN7iPlugin16staticMetaObjectE)

标签: c++ qt plugins symbols


【解决方案1】:

好的,我发现了问题,我的错。 对于那些会遇到这个问题的人:我的插件的 .pro 文件中有一条 INCLUDEDIR 行,我已将其删除,现在插件运行良好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-25
    • 2019-09-07
    • 1970-01-01
    相关资源
    最近更新 更多