Seite 1 von 1

Unresolved Links bei Signals und Slots trotz Q_OBJECT

Verfasst: 1. August 2008 08:32
von pospiech
Ich habe eine Thread Klasse "GratingVariation" die bislang in der Header Datei von der Klasse "DialogGratingPeriodVariation" oben mitdrinstand. Das funktionierte wunderbar. Dabei steht in beiden Klassen ein 'Q_OBJECT'.

Um den Code übersichtlicher zu machen habe ich den Thread Code in eine weitere Headerdatei "GratingVariationThread.h" ausgelagert, die jetzt so aussieht:

Code: Alles auswählen

#include <QtCore/QThread>

class GratingVariation : public QThread
{
   Q_OBJECT
public:
...
diese Headerdatei wird jetzt von DialogGratingPeriodVariation.h eingebunden.

Und jetzt wird der Code nicht mehr gelinkt. Ich bekomme nämlich bei allen Signals und Slots einen Linker Fehler
1>DialogGratingPeriodVariation.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""protected: void __thiscall GratingVariation::signalNewImageCreated(int)" (?signalNewImageCreated@GratingVariation@@IAEXH@Z)".
1>DialogGratingPeriodVariation.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""protected: void __thiscall GratingVariation::ThreadStopped(void)" (?ThreadStopped@GratingVariation@@IAEXXZ)".
1>DialogGratingPeriodVariation.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""protected: void __thiscall GratingVariation::NewImageAvailable(void)" (?NewImageAvailable@GratingVariation@@IAEXXZ)".
1>DialogGratingPeriodVariation.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""public: virtual int __thiscall GratingVariation::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@GratingVariation@@UAEHW4Call@QMetaObject@@HPAPAX@Z)".
1>DialogGratingPeriodVariation.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""public: virtual void * __thiscall GratingVariation::qt_metacast(char const *)" (?qt_metacast@GratingVariation@@UAEPAXPBD@Z)".
1>DialogGratingPeriodVariation.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""public: virtual struct QMetaObject const * __thiscall GratingVariation::metaObject(void)const " (?metaObject@GratingVariation@@UBEPBUQMetaObject@@XZ)".
Sicherlich mache ich etwas falsch, aber ich sehe nicht was, denn ich habe den Code ja nur in eine Headerdatei ausgelagert.

Aber vielleicht habe ich ja auch ein Grundkonzept nicht verstanden und benötige eine Erklärung.

Matthias

Verfasst: 1. August 2008 08:51
von Volker
Das Problem ist, dass die Anweisung Q_OBJECT für den Meta Object Compiler ist. Der erzeugt den Code für die fehlenden Verweise. Wenn Du aber nicht die entsprechende CPP Datei mit dem Ouput des MOCs in Dein Projekt integrierst, dann fehlen die Verweise.

Verfasst: 1. August 2008 08:53
von pospiech
Volker hat geschrieben:Das Problem ist, dass die Anweisung Q_OBJECT für den Meta Object Compiler ist. Der erzeugt den Code für die fehlenden Verweise. Wenn Du aber nicht die entsprechende CPP Datei mit dem Ouput des MOCs in Dein Projekt integrierst, dann fehlen die Verweise.
Muss denn für jede Header Datei der MOC Compiler ausgeführt werden?
Vorher wurde ja auch nur für eine Header Datei der Compiler aufgerufen und das reichte.

Verfasst: 1. August 2008 08:58
von Volker
Für jede die eine Klassendefinition mit Q_OBJECT enthält.