2014-11-01 51 views
0

我想在我的qt程序中有一個插件系統。Qt無法加載插件:undefined symbol iPlugin :: staticMetaObject

即使我認爲我的代碼是好的,我仍然在主程序中有鏈接錯誤。 我正在使用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」)在我的班級宣言和刪除Q_EXPORT_PLUGIN2(plug_text,TextPlugin) cpp文件,但沒有的已經改變了,錯誤是一樣的。

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

那麼,如果沒有看到包含QPluginLoader在內的代碼,就很難說。 – lpapp 2014-11-02 02:14:16

+0

您仍然隱藏重要的細節,例如''* lib的絕對路徑,出於調試目的*「,請不要混淆這些。 – lpapp 2014-11-02 08:10:53

+0

我已添加路徑。 – Bambou 2014-11-02 08:20:39

回答

0

好吧,我發現這個問題,是我不好。 對於那些會遇到這個問題的人:我的插件的.pro文件中有一條INCLUDEDIR行,我已經刪除了它,現在插件運行良好。

相關問題