![](/img/trans.png)
[英]Undefined reference to MasterController::StaticMetaObject
[英]undefined reference to staticMetaObject
看起来Qt没有正确处理Q_GADGET宏,因为我收到下面的错误。 谁知道为什么?
错误: 对'Exception :: staticMetaObject'的未定义引用
编辑:后来我发现MOC没有生成moc_exception.cpp。 有时,当我切换编译器工具包时,它编译得很好但是如果我添加另一个继承Exception的类,它再次不起作用。 问题需要在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;
}
我怀疑运行qmake可能会解决您的问题。 每次添加或删除Q_GADGET或Q_OBJECT宏时,请记住重新运行qmake,以使moc工具重新生成元数据的代码。
通过查看我在代码中没有发现任何问题,因此我将代码复制粘贴到我的机器上并构建并运行它。 在我为NObject构造函数添加实现后,它构建好了。 我在Qt5和Qt4上构建并成功运行它,程序在控制台上打印出Exception 。
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
在我的环境中,此代码是正确的。 但是我已经添加了构造函数NObject的主体。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.