对staticMetaObject的未定义引用
undefined reference to staticMetaObject
Qt似乎没有正确处理Q_GADGET宏,因为我收到了下面的错误。有人知道为什么吗?
错误: 未定义对`Exception::staticMetaObject'的引用
EDIT:后来我发现MOC不会生成MOC_exception.cpp。有时当我切换编译器套件时,它编译得很好,但如果我添加另一个继承exception的类,它再次不起作用。问题需要在MOC中的某个位置,在某些情况下忽略Q_GADGET宏?
我有问题5.5.0。
project.pro
CONFIG += c++11
QT += core
QT -= gui
SOURCES +=
main.cpp
HEADERS +=
nobject.h
exception.h
noject.h
#ifndef NOBJECT_H
#define NOBJECT_H
#include <QObject>
class NObject
{
Q_GADGET
public:
NObject() {}
virtual ~NObject() {}
};
#endif // NOBJECT_H
异常.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。
问题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
问题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添加到了构造函数的主体中。
相关文章:
- 编译C++时未定义的引用
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- 未定义的引用在哪里
- 编译时的 CImg 库返回对"__imp_SetDIBitsToDevice"的未定义引用
- 对Py_Initialize()的未定义引用
- 使用mysql c++连接器的未定义引用
- 未定义的引用 .. 使用 OpenCV 编译 C++ 代码时,从命令行
- 对 Scalar ::Scalar() 的未定义引用
- 已定义函数时出现 G++ "未定义的引用"错误
- 链接 cmake 时出现未定义的引用错误
- 对复制 CTOR 和 CTOR 的未定义引用
- 错误:未定义对'oboe::AudioStreamBuilder::openStream(oboe::AudioStream**)'的引用
- 右值引用未定义的行为
- 对"vtable for DigitalClock"的未定义引用 - 未定义对"DigitalClock::staticMetaObject"的引用 - Qt
- 函数类型到函数类型的引用:未定义的引用
- avcodec_alloc_context引用未定义,但ffmpeg链接顺序正确
- 从c++调用Fortran子程序,链接时引用未定义
- 枚举引用未定义,但位于包含的头文件中