Qt und Q_OBJECT

Gast #3832705
Lesenswert?

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 #3832755
Lesenswert?

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 #3832776
Lesenswert?

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 #3832807
Lesenswert?

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 #3832817
Lesenswert?

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....
#3832861
Lesenswert?

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 #3833205
Lesenswert?

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 #3833850
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren