簡體   English   中英

對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_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

在我的環境中,此代碼是正確的。 但是我已經添加了構造函數NObject的主體。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM