Qt und keine moc_*.cpp-Datei
Entwickle ich ein einfaches Qt-4-app und meine eigenen dialog. Ich Unterklassen QDialog
eingelegt, die Q_OBJECT
makro in der Klassen-Deklaration block, und... ich bekomme
[Linker error] undefined reference to `vtable for MyDialog', und es gibt keine
moc_MyDialog.cpp generiert die moc-compiler.
Ich bin mit Qt 4.1.3 auf Windows XP und mingw. Ich folgte den build-Prozess von Qt bereitgestellten build-shell. Ich verwendet qmake zum erstellen von Dateien und kompiliert alles mit einem Befehl machen.
Ich habe noch andere Klassen, die Subklasse QPushButton
und QObject
beziehungsweise, aber Sie kompilieren OK. Ich kann nicht finden, alle Unterschiede zwischen Ihnen und den gebrochenen ein.
Es muss etwas fehlt in der gebrochenen Klasse, aber ich bin nicht in der Lage, es zu lokalisieren.
InformationsquelleAutor der Frage | 2008-10-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die undefined reference to "vtable für MyDialog" verursacht wird, weil es keine moc-Datei. Die meisten c++ - Compiler erstellen, der vtable-definition in der Objekt-Datei mit der ersten virtuellen Funktion. Wenn Unterklassen einer qt-Objekt und verwenden die Q_OBJECT-makro, dieses wird in den moc*.cpp-Datei. Also, diese Fehlermeldung bedeutet, dass der moc-Datei fehlt.
Die möglichen Probleme, die ich denken kann, sind:
Die header-Datei für die Klasse MyDialog.h wird nicht Hinzugefügt, um HEADER in der qmake-Datei.
Lief man qmake generieren der Datei vor hinzufügen das Q_OBJECT-makro. Dieser erstellt eine make-Datei, ohne die moc Regeln. Dies ist leicht behoben, durch das einfache ausführen von qmake erneut.
Ihren dialog stammt aus mehr als einer Klasse und QDialog ist nicht die erste Klasse, die es abgeleitet wird. Für qmake, um korrekt zu arbeiten, das QObject abgeleitete Basisklasse muss die erste Klasse, die geerbt wird.
Wenn Sie mit Qt Creator, erhalten Sie möglicherweise diese Fehlermeldung, wenn Ihre Vorherige Implementierung war fehlgeschlagen, aus irgendeinem Grund (wie die Anwendung bereits ausgeführt wird). In diesem Fall, machen Sie einfach eine "Clean Project" und dann auf "Projekt neu" und dann "Ausführen" zu implementieren.
InformationsquelleAutor der Antwort David Dibben
Wenn Sie Ihre header-Datei enthalten ist, befolgen Sie die Schritte:
Dies wird klar, bis die alte Referenzen und bauen mit th Q_OBJECT makro. QT ist nicht auf neu erstellen.
InformationsquelleAutor der Antwort Kamrul
Muss ich sehen, dass das problem nur angezeigt, wenn Hinzugefügt wird, eine Klasse ohne Erweiterung und dann eine Erweiterung manuell Hinzugefügt wird.
Um das problem zu lösen setzte ich Q_OBJECT in die .h der Klasse und dann mit der rechten Maustaste auf "Quellen" -> "Hinzufügen Vorhandener Dateien..." auswählen .ccp meine modifizierte Klasse.
InformationsquelleAutor der Antwort Bemipefe
Sind Sie mit qmake? Vielleicht haben Sie nicht fügen Sie es Ihrer der .cpp-Datei, um Ihre QUELLEN und .h-Datei, um Ihre HEADER-variable in der qmake-Datei?
InformationsquelleAutor der Antwort user24560
Ich demütig schlage vor, Sie verwenden CMake für Gebäude Qt-Programme für Windows. Es wird halten Sie daran, fügen Sie die entsprechenden Dateien auf seiner build-Dateien.
Den zusätzlichen Wert, den Sie erzeugen kann make/nmake build-Dateien aus Visual Studio solution-Dateien. Und wenn die Kompilierung von der Quelle Qt für Visual Studio werden Sie in der Lage code-und build mit MS IDE/compiler.
Dies ist natürlich, wenn Sie mithilfe von Visual Studio überhaupt.
InformationsquelleAutor der Antwort Marcin Gil
Die Meldung undefined reference to `vtable for MyDialog' kann auch das Ergebnis einer fehlenden Umsetzung (MyDialog) von einer rein virtuellen Funktion in einer Klasse MyDialog abgeleitet ist.
InformationsquelleAutor der Antwort jelle foks