对staticMetaObject的未定义引用

Kra*_*rab 10 c++ qt

看起来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
Run Code Online (Sandbox Code Playgroud)

nobject.h

#ifndef NOBJECT_H
#define NOBJECT_H

#include <QObject>

class NObject
{

    Q_GADGET

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

};

#endif // NOBJECT_H
Run Code Online (Sandbox Code Playgroud)

exception.h

#ifndef EXCEPTION_H
#define EXCEPTION_H

#include "nobject.h"

class Exception : public NObject
{

    Q_GADGET

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

};

#endif // EXCEPTION_H
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

tal*_*aki 11

我怀疑运行qmake可能会解决您的问题.每次添加或删除Q_GADGETQ_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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

  • 这是一个经常让我出局的人。默认情况下,qmake 添加了一条规则,以便在项目文件中的 Makefile 过期时生成它。但是当您将 MOC 的宏之一添加到 `$HEADERS` 中的文件时,它不知道需要更新。你应该能够`make -B Makefile` 来强制它。 (2认同)