Forum: PC-Programmierung Qt und Q_OBJECT


von Pit (Gast)


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.

von Klaus W. (mfgkw)


Lesenswert?

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

Das ist aber keine Meldung vom Kompilieren, sondern vom Linken.
Irgendwelche Libs vergessen?

von Pit (Gast)


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.

von Axel J. (axeljaeger)


Lesenswert?

Zeig doch mal eine Klasse, die geht, im Vergleich zu einer, die nicht 
geht.

von Pit (Gast)


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

von Diek (Gast)


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.

von Pit (Gast)


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....

von Pit (Gast)


Lesenswert?

Rechtsklick auf das Projekt meinte ich.

von Axel J. (axeljaeger)


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.

von Pit (Gast)


Lesenswert?

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

von Εrnst B. (ernst)


Lesenswert?

Pit schrieb:
> Habe ich mittels Beyond Compare schon gemacht. Kein Unterschied bis auf
> den Klassennamen

d.h. die fehlende VTable ist vorhanden, und du hast nur das Object-File 
nicht dem Linker übergeben?

: Bearbeitet durch User
von petar (Gast)


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. ;-)

von Oliver (Gast)


Lesenswert?

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

von Pit (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.