2015-12-08 116 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的主体中。