Frage undefinierter Verweis auf staticMetaObject


Es sieht so aus, als ob Qt nicht mit der Q_GADGET Makro richtig, weil ich den Fehler unten bekomme. Wer weiß warum?

ERROR:  undefinierter Verweis auf `Exception :: staticMetaObject '

BEARBEITEN: Später stellte ich fest, dass der MOC keine moc_exception.cpp generiert. Manchmal, wenn ich das Compiler-Kit umstelle, kompiliert es gut, aber wenn ich eine andere Klasse hinzufüge, die Exception erbt, funktioniert es wieder nicht. Das Problem muss irgendwo in MOC sein, das den Q_GADGET-Makro unter bestimmten Bedingungen ignoriert?

Ich habe 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

Ausnahme.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;
}

5
2017-12-08 23:28


Ursprung


Antworten:


Ich vermute, das Ausführen von qmake könnte dein Problem lösen. Denken Sie daran, qmake jedes Mal erneut auszuführen, wenn Sie hinzufügen oder entfernen Q_GADGET oder Q_OBJECT Makro, um Moc-Tool zu erhalten, um Code für Metadaten neu zu generieren.

Ich habe kein Problem in Ihrem Code gefunden, indem ich es angeschaut habe, also kopiere ich den Code auf meinen Rechner und habe ihn gebaut und ausgeführt. Nachdem ich die Implementierung für den NObject-Konstruktor hinzugefügt hatte, wurde es ordnungsgemäß erstellt. Ich baute und lief es erfolgreich auf Qt5 und Qt4, und das Programm wurde gedruckt Ausnahme auf der Konsole.

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

8
2017-12-09 07:41



In meiner Umgebung ist dieser Code korrekt. Aber ich habe den Körper des Konstruktors NObject hinzugefügt.


1
2017-12-09 07:36