2015-12-08 112 views
3

它看起來像Qt沒有正確處理Q_GADGET宏,因爲我得到下面的錯誤。有人知道爲什麼未定義的引用staticMetaObject

錯誤:未定義的參考`異常:: staticMetaObject」

編輯:後來我發現,商務部不會產生moc_exception.cpp。有時,當我切換編譯器工具包編譯好,但比如果我添加另一個類繼承異常,它再次無法正常工作。這個問題需要在MOC的某個地方忽略Q_GADGET宏的某些條件?

我有Qt 5.5.0。

project.pro

CONFIG += c++11 

QT += core 
QT -= gui 

SOURCES += \ 
    main.cpp 

HEADERS += \ 
    nobject.h \ 
    exception.h 

nobject.h

#ifndef NOBJECT_H 
#define NOBJECT_H 

#include <QObject> 

class NObject 
{ 

    Q_GADGET 

public: 
    NObject() {} 
    virtual ~NObject() {} 

}; 

#endif // NOBJECT_H 

exception.h

#ifndef EXCEPTION_H 
#define EXCEPTION_H 

#include "nobject.h" 

class Exception : public NObject 
{ 

    Q_GADGET 

public: 
    Exception() {} 
    virtual ~Exception() {} 

}; 

#endif // EXCEPTION_H 

main.cpp

#include <iostream> 

#include "exception.h" 

using namespace std; 

int main(int argc, char* argv[]) { 

    Exception nobject; 

    std::cout << Exception::staticMetaObject.className() << std::endl; 

    return 0; 
} 

回答

5

我懷疑運行qmake可能會解決您的問題。記得每次添加或刪除時重新運行qmake Q_GADGETQ_OBJECT宏以獲取moc工具以重新生成元數據的代碼。

我在代碼中找不到任何問題,因此我將代碼複製粘貼到我的機器並構建並運行它。在我爲NObject構造函數添加實現之後,它就構建好了。我在Qt5和Qt4上成功構建並運行它,並在控制檯上打印異常

的Qt 5:

> ~/temp/qgadgettest$ qmake --version 
QMake version 3.0 
Using Qt version 5.2.1 in /usr/lib/i386-linux-gnu 

> /temp/qgadgettest$ ./qgadgettest 
Exception 

的Qt 4:

> ~/temp/qgadgettest$ qmake-qt4 --version 
QMake version 2.01a 
Using Qt version 4.8.6 in /usr/lib/i386-linux-gnu 

> ~/temp/qgadgettest$ ./qgadgettest 
Exception 
+1

這是一個經常抓住我。默認情況下,qmake在項目文件過期時添加一條規則來生成Makefile。但是當你將MOC的一個宏添加到'$ HEADERS'中的一個文件時,它不知道它需要更新。你應該可以'make -B Makefile'來強制它。 –

1

在我的環境中,此代碼是正確的。但是我已經添加到構造函數NObject的主體中。