C++ 对staticMetaObject的未定义引用

C++ 对staticMetaObject的未定义引用,c++,qt,C++,Qt,看起来Qt没有正确处理宏,因为我得到了下面的错误。有人知道为什么吗 错误:未定义对“Exception::staticMetaObject”的引用 编辑:后来我发现MOC没有生成MOC_exception.cpp。有时,当我切换编译器工具包时,它可以很好地编译,但如果我添加了另一个继承异常的类,则它再次无法工作。问题应该在MOC中的某个地方,在某些情况下忽略Q_GADGET宏 我有Qt5.5.0 project.pro CONFIG += c++11 QT += core QT -= gui

看起来Qt没有正确处理宏,因为我得到了下面的错误。有人知道为什么吗

错误:未定义对“Exception::staticMetaObject”的引用

编辑:后来我发现MOC没有生成MOC_exception.cpp。有时,当我切换编译器工具包时,它可以很好地编译,但如果我添加了另一个继承异常的类,则它再次无法工作。问题应该在MOC中的某个地方,在某些情况下忽略Q_GADGET宏

我有Qt5.5.0

project.pro

CONFIG += c++11

QT += core
QT -= gui

SOURCES += \
    main.cpp

HEADERS += \
    nobject.h \
    exception.h
nobject.h

#如果没有对象#
#定义NOBJECT_H
#包括
类对象
{
Q_小工具
公众:
NObject(){}
虚拟~NObject(){}
};
#endif//NOBJECT\u H
异常.h

\ifndef异常
#定义异常
#包括“nobject.h”
类异常:public NObject
{
Q_小工具
公众:
异常(){}
虚拟~Exception(){}
};
#endif//EXCEPTION\u H
main.cpp

#包括
#包括“exception.h”
使用名称空间std;
int main(int argc,char*argv[]){
例外对象;

std::cout在我的环境中,此代码是正确的。但我已将其添加到构造函数NObject的主体中。

我怀疑运行qmake可能会解决您的问题。请记住,每次添加或删除Q_GADGET或Q_OBJECT宏时都要重新运行qmake,以使moc工具重新生成元数据的代码

通过查看您的代码,我没有发现任何问题,所以我将代码复制粘贴到我的机器上,并构建和运行它。在我添加NoObject构造函数的实现后,它构建正常。我在Qt5和Qt4上成功构建并运行了它,程序在控制台上打印了异常

Qt 5:

Qt 4:


这是一个经常引起我注意的问题。默认情况下,qmake添加了一个规则,当Makefile从项目文件中过期时生成它。但是当您在
$HEADERS
中将一个MOC宏添加到文件中时,它不知道需要更新它。您应该能够
生成-B Makefile
来强制执行它。如果我不使用qmake?不使用它呢这里的任务是调用moc为新添加的元对象生成代码。您也可以手动运行moc。如果您手动编写Makefile,您可以在此处检查如何自动运行moc:。在cmake中,您使用cmakelists文件中的特定命令并重新运行cmake以重新生成元数据:
> ~/temp/qgadgettest$ qmake --version
QMake version 3.0
Using Qt version 5.2.1 in /usr/lib/i386-linux-gnu

> /temp/qgadgettest$ ./qgadgettest 
Exception
> ~/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