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

Alles rund um die Programmierung mit Qt
Antworten
kokasurfer
Beiträge: 8
Registriert: 3. Juni 2008 10:38
Wohnort: Munich

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

Beitrag 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
Zuletzt geändert von kokasurfer am 3. Juni 2008 16:20, insgesamt 1-mal geändert.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Den Source sollte man auch kompilieren - nur schreiben hat irgendwie keinen Sinn.

/edit: und was soll das Q_OBJECT da?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
PeterLustig
Beiträge: 386
Registriert: 21. November 2007 20:07

Beitrag von PeterLustig »

Christian81 hat geschrieben:und was soll das Q_OBJECT da?
QThread leitet von QObject ab. ;)
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

PeterLustig hat geschrieben: QThread leitet von QObject ab. ;)
Das ist kein Grund.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
close1
Beiträge: 39
Registriert: 9. April 2008 14:28
Kontaktdaten:

Beitrag 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.
Zuletzt geändert von close1 am 3. Juni 2008 13:18, insgesamt 1-mal geändert.
MfG

close1
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
kokasurfer
Beiträge: 8
Registriert: 3. Juni 2008 10:38
Wohnort: Munich

Beitrag 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...
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Woher soll der Compiler wissen was er machen soll??
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
kokasurfer
Beiträge: 8
Registriert: 3. Juni 2008 10:38
Wohnort: Munich

Beitrag 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'...
PeterLustig
Beiträge: 386
Registriert: 21. November 2007 20:07

Beitrag von PeterLustig »

Füg die cpp Datei in deine .pro Datei ein.

Weißt du denn was beim kompilieren von statten geht?
close1
Beiträge: 39
Registriert: 9. April 2008 14:28
Kontaktdaten:

Beitrag 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
MfG

close1
PeterLustig
Beiträge: 386
Registriert: 21. November 2007 20:07

Beitrag 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.
close1
Beiträge: 39
Registriert: 9. April 2008 14:28
Kontaktdaten:

Beitrag 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
MfG

close1
kokasurfer
Beiträge: 8
Registriert: 3. Juni 2008 10:38
Wohnort: Munich

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