2010-07-16 12 views
11

Ich erhalte den folgenden Linkfehler, wenn ich meine Anwendung erstelle.Q_OBJECT Linkfehler!

HIMyClass.obj:: error: unresolved external symbol "public: virtual struct QMetaObject const * __thiscall CHIMyClass::metaObject(void)const " ([email protected]@@[email protected]@XZ) File not found : HIMyClass.obj

HIMyClass.obj:: error: unresolved external symbol "public: virtual void * __thiscall CHIMyClass::qt_metacast(char const *)" ([email protected]@@[email protected]) File not found : HIMyClass.obj

HIMyClass.obj:: error: unresolved external symbol "public: virtual int __thiscall CHIMyClass::qt_metacall(enum QMetaObject::Call,int,void * *)" ([email protected]@@[email protected]@@[email protected]) File not found : HIMyClass.obj

Meine Klassendeklaration ist wie

class CHIMyClass:public QDialog 
{ 
    Q_OBJECT 

    .... 

}; 

Wenn ich Q_OBJECT Kommentar der Linker Fehler losgeht (und offensichtlich bin ich nicht in der Lage Signale und Slots verwenden). Ich verwende Qt Creator als IDE und Qt 4.5.3. Wenn ich gebe Rebuild All ist es sicher, dass QMake wird aufgerufen werden. Ich schätze, dass es bei der Generierung von moc_ * -Dateien genau dort liegt, wo das Problem liegt. Ich benutze Windows XP und cl als Compiler.

Was könnte der Grund für diesen Linker Fehler sein?

+0

Vielleicht 'Datei nicht gefunden: HIMyClass.obj' sagen uns, dass Qt Creator Moc/Obj/Temp-Dateien nicht gesehen? – mosg

+1

Wirklich, wiederholen Sie qmake. Suchen Sie auch nach fehlenden oder zusätzlichen "\" Zeichen in Ihrer .pro-Datei. – andref

Antwort

27

Solche Fehler bedeuten normalerweise, dass Sie die Kopfzeile Ihrer Klasse nicht der Variable "HEADERS" in der Profildatei hinzugefügt haben (der Metaobjekt-Compiler generiert moc_Dateien nur für die in dieser Variablen aufgeführten Kopfzeilen). Denken Sie daran, qmake auszuführen, nachdem Sie die .pro-Datei geändert haben!

+0

Die entsprechende Header-Datei ist bereits verfügbar unter HEADERS Variable immer noch mit dem Problem, aber .. Es ist nicht der Grund .. zumindest in meinem Fall .. :( – liaK

+2

Alle von qmake und allen Objektdateien erzeugten Dateien manuell löschen, dann qmake erneut ausführen. – chalup

+1

@ chalup, löschte ich alle MOC, OBJ, RCC-Dateien und rannte qmake, jetzt funktioniert es gut. Ich bin froh, dass es funktioniert hat, das ist wahnsinnig .. Warum so ein undefiniertes Verhalten ?? Irgendeine Schätzung? – liaK

0

Überprüfen Sie, ob die notwendigen Qt Konfigurationsoptionen vorhanden sind, in der Pro-Datei (QT += core gui zumindest. Versuchen Sie auch manuell alles löschen gebaut/in das Build-Verzeichnis erstellt. Manchmal kommt es vor, dass moc aus irgendeinem Grund nicht ausgeführt werden kann.

Sie können auch versuchen, den moc Befehl selbst ausgeführt wird, und sehen, was es gibt (Sie die Befehlszeile in dem Register „Kompilieren Ausgang“ in QtCreator

UPDATE:. thisZusammenhang Problem scheint, dass Sie vorschlagen don‘ t definiere QT_DLL beim Kompilieren Kannst du ein frisches und neues einfaches QtCreator-Projekt ausprobieren? (mit einem Widget, das zum Beispiel das Hauptfenster subclasses) und versuchen Sie es. Sie sollte automatisch einen Q_OBJECT-Header enthalten und versuchen, die .pro-Dateien und die Compilerausgabe zu vergleichen.

+0

Es fehlen nicht die Qt-Symbole, sondern die moc-generierten Symbole für seine eigene Klasse. Also würde ich lieber mit chalup gehen und prüfen, ob der Header in HEADERS aufgelistet ist. Ein komplett sauberer Build könnte ebenfalls helfen. –

+0

Es verbindet alle anderen Klassen, die Q_OBJECT Makro [email protected], habe ich die Datei in HEADERS Abschnitt und versuchte saubere Builds mehr als einmal .. Kein Glück, aber .. :( – liaK

1

Einchecken in der Datei MakeFile.debug und vielleicht HIMyClass existiert nicht.

Ich einfach umbenennen MakeFile.debug, Reinigen Sie das Projekt und erstellen Sie alles neu und es kompiliert.

12

Ich hatte ein ähnliches Problem und es wurde mit andref Feedback gelöst. Innerhalb QT Creator ich einfach:

  1. Bauen/Reinigen Sie alle
  2. Build/Run qmake
  3. Bauen/Lauf
+0

Das hat es für mich behoben – ThePosey

+0

qmake ist die Kernnote;) –

1

ich hatte das gleiche Problem, aber in meinem Fall war es nicht genug, um sauber -> bauen. Also musste ich manuell alle Dateien löschen, die im Buildprozess erstellt wurden (Mekefiles, ui descriptions in cpp und im Allgemeinen das gesamte Verzeichnis, das durch den Buildprozess erstellt wurde) und erst dann wurde der Build erfolgreich ausgeführt.

0

auf meiner OSX-Box war dies wegen fehlenden Moc * -Dateien. Ich habe das behoben, indem ich den bom aus meiner utf-8 kodierten .pro-Datei entfernt habe. Ich werde einen Fehler mit qt ablegen.

Fehler für Goggle-Suchen ... HINWEIS: eine fehlende Vtable bedeutet in der Regel die erste nicht-inline virtuelle Member-Funktion hat keine Definition.

"vtable for MainWindow", referenced from:

MainWindow::MainWindow(QWidget*)in mainwindow.o 
1

Da schreibe diesen Beitrag, ich habe

überarbeitet

Ich fand, dass ich die .pro Datei berühren müssen vor dem Umbau, dh

  1. hinzufügen zufällige Zeichen
  2. Speichern
  3. Löschen Sie zufällige Zeichen
  4. Speichern Sie
  5. Projekt
  6. Build-

Schritte 1 bis 4 scheint alle alten moc * Dateien ungültig zu machen qmake sie zu zwingen, wieder aufzubauen. Andernfalls scheint ein Rebuild-Projekt veraltete Moc * -Dateien zu verwenden.

[EDIT] Aktualisierte Antwort.

Seit ich diesen Beitrag geschrieben habe, bin ich ziemlich viel gewesen clean, qmake dann build. Die qmake ist wichtig, da sie Moc * -Dateien reproduziert, die Sie benötigen, wenn Sie Ihre .h-Dateien ändern und Ihre Vererbung gegen Q_OBJECT ändern. In einigen Fällen können Sie sogar einfach qmake und dann build für einen inkrementellen Build ausführen.

0

fand ich eine andere mögliche Ursache und Lösung zu diesem Fehler

Dieser Fehler tritt auch auf, wenn man den Schlitz in .h-Datei deklariert hat, aber seinen Körper nicht

0

Ich hatte dieses Problem bei der Umsetzung definiert . Überprüfen Sie, ob eine Beschreibung der Implementierung des Steckplatzes in der CPP-Datei vorhanden ist.

0

Ich hatte #include "main.moc" aus meiner Hauptdatei entfernt und vergessen, es wieder hinzuzufügen ... Das war ein Spaß Time-Waster!

0

Antworten von @chalup und @ierax hat mir geholfen. Ich musste den Qt-Ersteller schließen und ihn erneut öffnen, damit qmake in Kraft treten konnte. Ich folgte diesen Schritten: 1. Die Klassendefinition in eine Header-Datei verschoben. 2. Header-Datei zum Projekt hinzugefügt und sichergestellt, dass es gegen HEADERS + = \ list in .pro-Datei aufgeführt ist. 3. Clean-all 4. schließen QtCreator (unter Windows 10) 5. Löschen Sie Makefiles aus dem Projektverzeichnis 6. Öffnen Sie QtCreator und öffnen Sie das Projekt. 7. Qmake um sicherzustellen, Makefiles generiert werden. 8. Rebuild-all

Diese Schritte halfen mir, dieses Problem zu lösen - ich kämpfte für über eine Stunde mit verschiedenen anderen Antworten und Methoden nichts funktionierte. Bevor du qmake ausführst, vergewissere dich, dass du Makefiles löschst und QtCreator schließe (mindestens auf Windows 10 anwendbar).