【问题标题】:undefined reference to staticMetaObject对 staticMetaObject 的未定义引用
【发布时间】:2015-12-08 23:28:21
【问题描述】:

看起来 Qt 没有正确处理 Q_GADGET 宏,因为我收到以下错误。有人知道为什么吗?

错误: 对 `Exception::staticMetaObject' 的未定义引用

编辑: 后来我发现 MOC 不生成 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

ma​​in.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;
}

【问题讨论】:

    标签: c++ qt


    【解决方案1】:

    我怀疑运行 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
    

    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
    

    【讨论】:

    • 这是一个经常吸引我的人。默认情况下,qmake 添加一个规则以在项目文件中过期时生成 Makefile。但是当您将 MOC 的一个宏添加到$HEADERS 中的文件时,它不知道需要更新它。你应该可以make -B Makefile强制它。
    • 如果我不使用 qmake 怎么办?
    • 这里的重点是调用 moc 为新添加的元对象生成代码。您也可以手动运行 moc。如果您手动编写 Makefile,您可以在此处查看如何自动化 moc 运行:doc.qt.io/qt-5/moc.html。在 cmake 中,您使用 cmakelists 文件中的特定命令并重新运行 cmake 以重新生成元数据:doc.qt.io/qt-5/cmake-manual.html
    【解决方案2】:

    在我的环境中,这段代码是正确的。但我已经添加到构造函数 NObject 的主体中。

    【讨论】:

      猜你喜欢
      • 2019-07-04
      • 2012-03-05
      • 1970-01-01
      • 1970-01-01
      • 2011-03-27
      • 2022-01-22
      • 2016-04-04
      • 2015-11-03
      • 2011-08-11
      相关资源
      最近更新 更多