Qt und Q_OBJECT

Gast #3832705
Hallo zusammen,

ich habe ein Problem mit einer Klasse in Qt:
1
#include <QThread>
2
#include <QObject>
3

4

5
class Foo: public QThread
6
{
7
    Q_OBJECT
8

9
public:
10
    Foo();
11

12
};

Wenn ich mein Programm so compiliere bekomme ich die Fehlermeldung:
undefined reference to `vtable for Foo'

Diese Fehlermeldung hatte ich schon öfters. Dafür habe ich dann ein 
Clean und qmake aufgerufen und alles war ok. Dieses mal hilft das aber 
nicht.

Lasse ich das Makro Q_OBJECT weg ist die moc_Foo.cpp leer. Ich habe 
mehrere Klassen, die von QThread abgeleitet sind und das Q_OBJECT Makro 
nutzen. Daher verstehe ich nicht warum es bei dieser Klasse nicht 
funktioniert.
Gast
Klaus Wachtler schrieb:
> Das ist aber keine Meldung vom Kompilieren, sondern vom Linken.
> Irgendwelche Libs vergessen?

Ja mein Fehler, ist natürlich eine Fehlermeldung vom Linker.
Der Aufbau ist identisch zu den anderen Klassen. Genau das ist ja so 
komisch.
Übrigens ist der obige Code 1:1 aus meinem Projekt. Also kein umgebautes 
Minimalbeispiel oder sowas, wo die Hälfte fehlt.
Gast
Axel Jäger schrieb:
> Zeig doch mal eine Klasse, die geht, im Vergleich zu einer, die nicht
> geht.

Die anderen Klassen haben auch nicht mehr Includes und sehen bis auf ein 
paar Methoden identisch aus. Schreibfehler oder sonstiges ist 
auszuschließen und ich habe jetzt schon mehrere Klassen angelegt und es 
kommt immer die gleiche Fehlermeldung
Gast
Hast du das Q_OBJECT nachträglich hinzugefügt?
Hatte sowas auch schon ein paar mal, half bisher nur das komplette 
Projekt zu bereinigen, alle durchs Kompilieren und Linken erstellte 
Dateien von Hand zu löschen und dann neu zu Erstellen.
Scheint eine Macke vom QTCreator zu sein.
Gast
Diek schrieb:
> Hast du das Q_OBJECT nachträglich hinzugefügt?

Ja habe ich.

Diek schrieb:
> Hatte sowas auch schon ein paar mal, half bisher nur das komplette
> Projekt zu bereinigen, alle durchs Kompilieren und Linken erstellte
> Dateien von Hand zu löschen und dann neu zu Erstellen.

Habe ich schon mehrmals gemacht. Rechtsklick auf die .pro. Dann clean, 
run qmake und rebuild. Hat vorher auch immer geholfen, dieses mal halt 
nicht....
Pit schrieb:
> Axel Jäger schrieb:
>> Zeig doch mal eine Klasse, die geht, im Vergleich zu einer, die nicht
>> geht.
>
> Die anderen Klassen haben auch nicht mehr Includes und sehen bis auf ein
> paar Methoden identisch aus. Schreibfehler oder sonstiges ist
> auszuschließen und ich habe jetzt schon mehrere Klassen angelegt und es
> kommt immer die gleiche Fehlermeldung

Die Sache ist doch ganz klar: Es muss einen Unterschied geben zwischen 
den funktionierenden und den nicht funktionierenden. Entweder Du gibst 
die Informationen raus, die uns einen Vergleich ermöglichen oder du 
machst den Vergleich, nötigenfalls auf Bitebene selber.
Gast
Axel Jäger schrieb:
> Entweder Du gibst
> die Informationen raus, die uns einen Vergleich ermöglichen oder du
> machst den Vergleich, nötigenfalls auf Bitebene selber.

Habe ich mittels Beyond Compare schon gemacht. Kein Unterschied bis auf 
den Klassennamen
Gast
Pit schrieb:
> Axel Jäger schrieb:
>> Entweder Du gibst
>> die Informationen raus, die uns einen Vergleich ermöglichen oder du
>> machst den Vergleich, nötigenfalls auf Bitebene selber.
> Habe ich mittels Beyond Compare schon gemacht. Kein Unterschied bis auf
> den Klassennamen
Hast du auch in die *.pro-Datei geschaut?
Da fehlt vermutlich das Einbinden des Headers in dem Foo deklariert 
wird.
1
HEADERS += Foo.h

Diek schrieb:
> Hast du das Q_OBJECT nachträglich hinzugefügt?
> Hatte sowas auch schon ein paar mal, half bisher nur das komplette
> Projekt zu bereinigen, alle durchs Kompilieren und Linken erstellte
> Dateien von Hand zu löschen und dann neu zu Erstellen.
> Scheint eine Macke vom QTCreator zu sein.
Das ist keine Macke des Qt Creators, sondern beim Kompilier-Prozess von 
Qt einfach so. Für weiteres Informationen darüber siehe Assistant. ;-)

Mit dem Qt Creator wäre der Fehler nicht aufgetreten und ein 
qmake-Aufruf (über den Qt Creator) und die nächste Kompilierung wäre 
erfolgreich gewesen. Außer es würde noch weitere Fehler geben. ;-)
Gast
petar schrieb:
> Das ist keine Macke des Qt Creators, sondern beim Kompilier-Prozess von
> Qt einfach so.

Na ja, von Hand löschen muß man da üblicherweise nichts. Eigentlich 
reicht ein handgestarter Lauf von qmake, im Ausnahmefall braucht es ein 
clean.

Oliver
Gast
petar schrieb:
> Mit dem Qt Creator wäre der Fehler nicht aufgetreten und ein
> qmake-Aufruf (über den Qt Creator) und die nächste Kompilierung wäre
> erfolgreich gewesen. Außer es würde noch weitere Fehler geben. ;-)

Jetzt funktioniert die Sache. Jedoch weiss ich nicht warum.
Ich habe zuerst die Klasse eingefügt. Danach ein clean und run qmake. 
Anschließend die Vererbung von QThread, dann wieder clean und run qmake. 
Ich habe nach jeder neuen Zeile ein clean und run qmake gemacht und 
komischerweise gehts nun.
Die Foo.h stand die ganze Zeit bei den Headers drinnen. Ich habe 
mehrmals alle moc Files von Hand gelöscht. Also mir ist die ganze Sache 
unerklärlich.

Benutzt wird übrigens Qt 5.2.1 mit dem QtCreator 3.1.0

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 12 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.