17 Stimmen

Qt und keine moc_*.cpp-Datei

Ich entwickle eine einfache Qt 4-Anwendung und erstelle meinen eigenen Dialog. Ich habe die Unterklasse QDialog eingefügt, die Q_OBJECT Makro im Klassendeklarationsblock, und... Ich erhalte

[Linker-Fehler] undefinierte Referenz auf `vtable for MyDialog' und es gibt keine moc_MyDialog.cpp, die vom moc-Compiler erzeugt wurde.

Ich verwende Qt 4.1.3 unter Windows XP und mingw. Ich folgte dem Build-Prozess aus der von Qt bereitgestellten Build-Shell. Ich habe qmake zum Erstellen von make-Dateien verwendet und alles mit einem make-Befehl kompiliert.

Ich habe andere Klassen, die Unterklassen QPushButton y QObject aber sie lassen sich gut kompilieren. Ich kann keine Unterschiede zwischen ihnen und der defekten Version finden.

In der kaputten Klasse muss etwas fehlen, aber ich kann es nicht entdecken.

36voto

David Dibben Punkte 17424

Der undefinierte Verweis auf "vtable for MyDialog" wird verursacht, weil es keine moc-Datei gibt. Die meisten C++-Compiler erstellen die vtable-Definition in der Objektdatei, die die erste virtuelle Funktion enthält. Wenn Sie ein qt-Objekt subklassifizieren und das Q_OBJECT-Makro verwenden, befindet sich dies in der Datei moc*.cpp. Daher bedeutet dieser Fehler, dass die moc-Datei fehlt.

Die möglichen Probleme, die ich mir vorstellen kann, sind:

  1. Die Header-Datei für die Klasse MyDialog.h wird nicht zu HEADERS in der qmake-Datei hinzugefügt.

  2. Sie haben qmake ausgeführt, um die Make-Datei zu erzeugen vor Hinzufügen des Makros Q_OBJECT. Dadurch wurde eine Make-Datei ohne die moc-Regeln erstellt. Dies lässt sich leicht beheben, indem man einfach qmake erneut ausführt.

  3. Ihr Dialog wird von mehr als einer Klasse abgeleitet und QDialog ist nicht die erste Klasse, von der er abgeleitet wird. Damit qmake korrekt funktioniert, muss die von QObject abgeleitete Basisklasse die erste Klasse sein, von der geerbt wird.

  4. Wenn Sie Qt Creator verwenden, kann dieser Fehler auftreten, wenn die vorherige Bereitstellung aus irgendeinem Grund fehlgeschlagen ist (z. B. weil die Anwendung bereits läuft). Führen Sie in diesem Fall einfach ein "Clean Project" und dann "Rebuild Project" und "Run" aus, um die Bereitstellung durchzuführen.

4voto

Kamrul Punkte 324

Wenn Sie Ihre Header-Datei eingebunden haben, folgen Sie den Schritten:

  1. Klicken Sie mit der rechten Maustaste auf das Projekt, dem Sie dies hinzugefügt haben.
  2. Klicken Sie auf "qmake ausführen".

Dadurch werden die alten Referenzen gelöscht und mit dem Makro Q_OBJECT erstellt. QT macht das nicht beim Rebuild.

1voto

Bemipefe Punkte 1248

Ich habe gesehen, dass das Problem nur auftritt, wenn eine Klasse ohne Erweiterung hinzugefügt wird und dann eine Erweiterung manuell hinzugefügt wird.

Um das Problem zu lösen, füge ich Q_OBJECT in die .h der Klasse ein und klicke dann mit der rechten Maustaste auf "Sources" -> "Add Existing Files..." und wähle die .ccp meiner modifizierten Klasse.

0voto

user24560 Punkte 878

Verwenden Sie qmake? Vielleicht haben Sie es nicht zu Ihrer .cpp Datei zu Ihren SOURCES und .h Datei zu Ihrer HEADERS Variable in der qmake Datei hinzugefügt?

0voto

Marcin Gil Punkte 65334

Ich schlage demütig vor, Sie verwenden CMake für die Erstellung von Qt-Programmen unter Windows. Es wird Sie daran erinnern, die entsprechenden Dateien zu seinen Build-Dateien hinzuzufügen.

Der zusätzliche Nutzen besteht darin, dass Sie daraus make/nmake-Build-Dateien und Visual Studio-Lösungsdateien erzeugen können. Und wenn Sie Qt aus dem Quellcode für Visual Studio kompilieren, können Sie mit MS IDE/Compiler sowohl coden als auch bauen.

Dies gilt natürlich nur, wenn Sie Visual Studio überhaupt verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X