Q_OBJECT linker-Fehler!
Ich erhalte die folgende linker-Fehler, wenn ich bauen meine Anwendung.
HIMyClass.obj:: error:
nicht aufgelöstes externes symbol "public:
virtual struct QMetaObject const *
__thiscall CHIMyClass::metaObject(void)const
"
(?metaObject@CHIMyClass@@UBEPBUQMetaObject@@XZ)
Datei nicht gefunden : HIMyClass.objHIMyClass.obj:: error:
nicht aufgelöstes externes symbol "public:
virtual void * __thiscall
CHIMyClass::qt_metacast(char
const *)"
(?qt_metacast@CHIMyClass@@UAEPAXPBD@Z) - Datei nicht gefunden : HIMyClass.objHIMyClass.obj:: error:
nicht aufgelöstes externes symbol "public:
virtual int __thiscall
CHIMyClass::qt_metacall(enum
QMetaObject::Call,int,void * *)"
(?qt_metacall@CHIMyClass@@UAEHW4Call@QMetaObject@@HPAPAX@Z) - Datei nicht gefunden : HIMyClass.obj
Meiner Klasse Erklärung wie
class CHIMyClass:public QDialog
{
Q_OBJECT
....
};
Wenn ich Kommentar Q_OBJECT die linker-Fehler erlischt (und offensichtlich bin ich nicht in der Lage, die Signale und slots). Ich bin mit der Qt Creator IDE und die Qt 4.5.3. Wenn ich Rebuild All es eindeutig, dass QMake aufgerufen werden. Ich denke, dass die generation der moc_* Dateien ist, wo das problem liegt. Ich bin mit Windows XP und cl, da der compiler.
Was könnte der Grund sein, hinter diese linker-Fehler?
File not found : HIMyClass.obj
uns sagen, dass der Qt Creator nicht sah moc/obj/temp-Dateien?Wirklich erneut qmake. Überprüfen Sie auch für fehlende oder zusätzliche " \ " - Zeichen in Ihrem .pro Datei.
InformationsquelleAutor liaK | 2010-07-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Solche Fehler in der Regel bedeuten, dass Sie haven ' T Hinzugefügt die header der Klasse "HEADER" - Variablen in pro-Datei (meta-Objekt-compiler generiert moc_ Dateien nur für die überschriften aufgelistet, die in dieser variable). Denken Sie daran, ausführen von qmake, nachdem Sie ändern .pro Datei!
Löschen Sie von hand alle Dateien generiert, die von qmake und alle Objekt-Dateien, führen Sie dann erneut qmake.
chalup, ich löschte alle MOC, OBJ,RCC-Dateien ran und qmake, jetzt funktioniert ' s einwandfrei. Während bin froh, dass es geklappt hat, das ist verrückt.. Warum so ein Undefiniertes Verhalten?? Irgendeine Idee??
Es ist nicht undefiniert. Tatsächlich, es ist ziemlich deterministisch: 1. Erstellen Sie eine Klasse, die Sie erweitert QObject aber vergessen, hinzuzufügen Q_OBJECT. 2. qmake 3. 4. Hinzufügen Q_OBJECT in die Klasse. 5. 6. Gleiche Fehler. 7. qmake 8. machen 9. Keine Fehler mehr. Qmake werden nur hinzufügen, ein " moc " - Regel, um diese Dateien in HEADER, die eine Klasse mit dem Q_OBJECT makro irgendwo.
InformationsquelleAutor chalup
Ich hatte ein ähnliches problem und es wurde gelöst mit andref feedback. Innerhalb von QT Creator ich einfach:
qmake ist ein wichtiger Hinweis 😉
InformationsquelleAutor sakisk
Seit diesem post habe ich überarbeitet
Fand ich, dass ich brauche zu berühren, der
.pro
Datei vor dem Umbau, d.h.Schritte 1 - 4 scheint zu erlöschen alle alten moc* - Dateien erzwingen
qmake
Sie wieder aufzubauen.Ansonsten, ein Umbau-Projekt scheint die Verwendung veralteter moc-Dateien*.
[BEARBEITEN] Aktualisierte Antwort.
Seit diesem post, habe ich ziemlich viel gewesen
clean
,qmake
dannbuild
. Dieqmake
ist wichtig, da es reproduziert moc* Dateien, die Sie benötigen, wenn Sie ändern .h-Dateien und ändern Sie Ihre erbschaft gegenQ_OBJECT
. In der Tat, in einigen Fällen, Sie können sogar in der Lage sein, einfach das zu tunqmake
dannbuild
für einen inkrementellen build.InformationsquelleAutor Stephen Quan
Überprüfen Sie in der Datei
MakeFile.debug
und vielleichtHIMyClass
nicht existiert.Ich nur umbenennen
MakeFile.debug
, Reinigen Sie das Projekt und Alles neu erstellen und es kompiliert.InformationsquelleAutor Carlos Nieto
Ich hatte das gleiche problem, aber in meinem Fall war es nicht genug zu reinigen -> bauen. Also musste ich manuell löschen, alle Dateien im build-Prozess (Mekefiles, ui descriptionns in cpp-und in der Regel ganze Verzeichnis erstellt build-Prozess) und nur dann aufzubauen, geglückt ist.
InformationsquelleAutor Tomek
Überprüfen, dass die erforderlichen Qt-config-Optionen sind vorhanden in der pro-Datei (
QT += core gui
zumindest. Auch versuchen manuell zu löschen alles, was gebaut/angelegt, in das build-Verzeichnis. Manchmal passiert es, dassmoc
nicht ausgeführt aus irgendeinem Grund.Können Sie auch versuchen, das moc-Befehl selbst, und sehen, was es gibt (Sie finden die Befehlszeile in der Registerkarte "Kompilieren Ausgang" in den QtCreator.
UPDATE: diese Verwandte problem scheint zu suggerieren, die Sie nicht definieren QT_DLL beim kompilieren. Können Sie versuchen, eine frische und neue, einfache QtCreator Projekt (mit einem widget, dass Unterklassen mainwindow zum Beispiel) und versuchen, die. Es sollte eine Q_OBJECT-header automatisch und versuchen zu vergleichen .pro Dateien und compiler-Ausgaben.
Es ist die Verknüpfung fine alle anderen Klassen, hat Q_OBJECT makro. @Frank, ich habe die Datei in den HEADER-Abschnitt und versucht sauber baut mehr als einmal.. Kein Glück, wenn.. 🙁
InformationsquelleAutor rubenvb
auf meine osx-box war dies aufgrund der fehlenden moc-Dateien*.
ich reparierte diese durch entfernen der Stückliste aus meinem utf-8-kodiert .pro Datei.
ich werde einen bug mit qt.
Fehler für die goggle-Suche...
HINWEIS: eine fehlende vtable bedeutet in der Regel die erste nicht-inline-virtuelle member-Funktion hat keine definition.
InformationsquelleAutor jimmy
Fand ich eine weitere mögliche Ursache und Lösung zu diesem Fehler
Dieser Fehler wird auch auftreten, wenn man erklärt hat, den slot in .h-Datei, aber nicht definiert hat seinen Körper in die Umsetzung
InformationsquelleAutor user3079474
Hatte ich dieses problem.
Überprüfen Sie, ob es eine Beschreibung der Umsetzung des slot-in .cpp-Datei.
InformationsquelleAutor RN3KK Nick
Hatte ich entfernt
#include "main.moc"
aus meiner Haupt-Datei, und vergessen Sie es erneut hinzuzufügen... Das war eine lustige Zeit waster!InformationsquelleAutor kayleeFrye_onDeck
Antworten von @chalup und @ierax hat mir geholfen. Ich hatte, um das Qt-creator und öffnen Sie es erneut, obwohl für qmake wirksam werden. Ich folgte diesen Schritten:
1. Zog die Klassendefinition in einer header-Datei.
2. Hinzugefügt header-Datei zum Projekt und gewährleistet, es ist gegen HEADERS += \ Liste .pro Datei.
3. Sauber-alle
4. in der Nähe QtCreator (auf Windows 10)
5. Löschen Makefiles aus dem Projekt-Verzeichnis
6. Öffnen QtCreator und öffnen Sie das Projekt.
7. Qmake, um sicherzustellen, makefiles erzeugt werden.
8. Rebuild alle
Diese Schritte hat mir geholfen, dieses Problem zu lösen - ich kämpfte über eine Stunde mit anderen Antworten und Methoden, nichts funktionierte. Vor dem ausführen von qmake sicherzustellen, dass Sie löschen makefiles und schließen QtCreator (gilt mindestens auf windows 10).
InformationsquelleAutor vinaymk