Seite 1 von 1

[gelöst]QThread und undefined reference to Kon/Destruktor

Verfasst: 3. Juni 2008 11:05
von kokasurfer
Hallo zusammen!

Ich habe ein dummes Problem, bei dem ich leider nicht mehr alleine weiterkomme.
Ich möchte nämlich für meine TCP Connection einen eigenen Thread erstellen und habe das auch wie in der Doku beschreiben gemacht:

Code: Alles auswählen

#ifndef TCPTHREAD_H_
#define TCPTHREAD_H_

#include <QThread>
class QTcpServer;
class QTcpSocket;

 class TcpThread : public QThread {	 
	    Q_OBJECT
	
public:
	TcpThread(QObject *parent = 0);
	~TcpThread();
	
protected:
	void run();
};
#endif /*TCPTHREAD_H_*/
und

Code: Alles auswählen

#include <tcpThread.h>

TcpThread::TcpThread(QObject *parent) : QThread(parent){
...
}

TcpThread::~TcpThread() {
...	
}

void TcpThread::run() {
...	
}
Eine Instanz habe ich dann in den Konstruktor meiner Gui Klasse eingefügt und tcpThread.h in die tcsimu.h eingefügt:

Code: Alles auswählen

#include <tcsimu.h>

//constructor
TcSimu::TcSimu(QWidget *parent) : QMainWindow(parent) {
	
QWidget *sourceWidget = new QWidget;
setCentralWidget(sourceWidget);
	
settingDialog = 0;
readSettings();
    
    TcpThread myThread;
    myThread.start();
...
Jetzt bekomme ich aber immer eine Fehler mit :
undefined reference to `TcpThread::~TcpThread()' tcsimu.cpp
undefined reference to `TcpThread::TcpThread()' tcsimu.cpp

Ich weiß jetzt nicht mehr was falsch sein soll. "undefined reference" Fehler kommen doch etgl nur bei Deklaration der Funktion ohne sie dann zu definieren oder bei Fehlen der libs. Aber QtCore ist integriert, sonst würde einiges andere auch nicht funktionieren.

Wäre nett, wenn sich jemand meinem Problem annehmen würde, denn nach 2-maligem Neuschreiben um evtl.e Schreibfehler auszuschließen, find ich keinen Lösungsansatz mehr. Habe ich irgendwas vergessen?

Gruß
kokasurfer

Verfasst: 3. Juni 2008 11:26
von Christian81
Den Source sollte man auch kompilieren - nur schreiben hat irgendwie keinen Sinn.

/edit: und was soll das Q_OBJECT da?

Verfasst: 3. Juni 2008 12:43
von PeterLustig
Christian81 hat geschrieben:und was soll das Q_OBJECT da?
QThread leitet von QObject ab. ;)

Verfasst: 3. Juni 2008 12:45
von Christian81
PeterLustig hat geschrieben: QThread leitet von QObject ab. ;)
Das ist kein Grund.

Verfasst: 3. Juni 2008 13:13
von close1
PeterLustig hat geschrieben:
Christian81 hat geschrieben:und was soll das Q_OBJECT da?
QThread leitet von QObject ab. ;)
Q_Object ist nur bei Klassen nötig die Signals/Slots benutzen, oder .UI Dateien(und somit auch durch den MOC compiler gehen)

@kokasurfer: der code erscheint mir richtig, aber hast Du schonmal daran gedacht was passiert wenn "TCPTHREAD_H_" definiert wurde bevor Du die instanz der Klasse anlegst?

sonst könnte das Q_Object stören aber da bin ich mir nicht sicher.

Verfasst: 3. Juni 2008 13:17
von Christian81
close1 hat geschrieben: @kokasurfer: der code erscheint mir richtig, aber hast Du schonmal daran gedacht was passiert wenn "TCPTHREAD_H_" definiert wurde bevor Du die instanz der Klasse anlegst?
Ich spiel heute mal Oberlehrer :lol:
Dann würde er nen Compilerfehler bekommen, keinen Linkerfehler.

Verfasst: 3. Juni 2008 13:40
von kokasurfer
Viele Dank für die schnellen Antworten!

- Die Q_OBJECT hab ich drinnen, weil ich in der TcpThread noch mehr stehen hab, welches aber im Moment auskommentiert ist. Ich will eben auch S&S nutzen.

- Ich will ja auch das der SourceCode mitkompiliert. Muss ich dafür jetzt extra was hinzufügen? Ich habe eben meine tcpThread.h in meine TcSimu.h included, in der ich auch die Instanz erstelle. Die .cpp sollte er doch dann etgl automatisch finden, oder? Habe ich bisher immer so gemacht und hat auch geklappt. Aber das könnte auch dran liegen, dass ich bisher nur "GUI-Klassen" vererbt habe...

Verfasst: 3. Juni 2008 13:44
von Christian81
Woher soll der Compiler wissen was er machen soll??

Verfasst: 3. Juni 2008 13:58
von kokasurfer
@Christian: hmm, ja. Die Frage stellt sich mir auch ;)
Aber wie bewerkstellige ich denn, das die .cpp mitkompiliert wird? #include is ja nich'...

Verfasst: 3. Juni 2008 14:03
von PeterLustig
Füg die cpp Datei in deine .pro Datei ein.

Weißt du denn was beim kompilieren von statten geht?

Verfasst: 3. Juni 2008 14:36
von close1
PeterLustig hat geschrieben:Füg die cpp Datei in deine .pro Datei ein.

Weißt du denn was beim kompilieren von statten geht?
mit visual studio könnte man einfach einen Benutzerdefinierten Buildschritt machen, der das ganze dann durch den MOC schiebt :D
ach ja danach den generierten code noch includieren ;D

BTW: laptop tastatur ist Mist :x

Verfasst: 3. Juni 2008 14:46
von PeterLustig
Und das musst du für jede Datei die Q_OBJECT enthält machen. Viel einfacher (und vor allem Platformunabhängiger!) ist es die Datei in deine .pro Datei hinzuzufügen.

Die pro Datei kannst du auch mal eben nach Linux kopieren und dort das Projekt kompilieren. Versuch das mal mit einem Visual Studio Projekt.

Verfasst: 3. Juni 2008 15:13
von close1
PeterLustig hat geschrieben:Und das musst du für jede Datei die Q_OBJECT enthält machen. Viel einfacher (und vor allem Platformunabhängiger!) ist es die Datei in deine .pro Datei hinzuzufügen.

Die pro Datei kannst du auch mal eben nach Linux kopieren und dort das Projekt kompilieren. Versuch das mal mit einem Visual Studio Projekt.
sorry für OT aber:

mit meinen linux Kenntnissen(oder besser Unkenntissen :D) würd ich es wohl eher schaffen visual studio Projekte unter linux zu compilieren xD

tja sorry, hab mit Linux wenig am hut

Verfasst: 3. Juni 2008 16:19
von kokasurfer
Danke für die Hilfe!

Jetzt weiß ich auch was ich falsch gemacht habe:
Ich arbeite mit Eclipse und dachte, dass es wie bei workspace-Projekten dann automatisch in die .pro eingefügt wird.
Hab aber dieses Projekt importiert und da passiert es dann anscheinend nicht auch wenn ich die Datei in Eclipse erstell.

Ja, was beim kompilieren passiert weiß ich. Nur bin ich leider noch nicht so routiniert an alles zu denken und hab mich in dem Punkt auf Eclipse verlassen..;)