[gelöst] Probleme mit Q_OBJECT

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
Bronski
Beiträge: 44
Registriert: 10. Oktober 2008 13:46

[gelöst] Probleme mit Q_OBJECT

Beitrag von Bronski »

Hallo,
bei folgendem Code:

Code: Alles auswählen


#include <iostream>

#include <QtCore>

#include <QCoreApplication>

#include <QtNetwork>
#include <QtSql>
#include <QtXml>

class Tlog_tester;

class Tlog_tester:public QObject
{
Q_OBJECT
private:

protected:
public:
Tlog_tester();
 ~Tlog_tester();
void start(Terror_log*);

//signals:

//void log_error( Terror_msg );


};



Tlog_tester::Tlog_tester()
{
}

Tlog_tester::~Tlog_tester()
{
}

void Tlog_tester::start(Terror_log* error_log_ptr)
{
 Terror_msg error_msg;
    error_msg.nr = 2000;
    error_msg.type = debug;
    error_msg.occured_in = "Tlog_tester";//this->objectName();
    error_msg.arguments.append("mit einem Parameter\n");

/*
connect(this,SIGNAL(log_error(Terror_message)),error_log_ptr,SLOT(reveive_error_to_log(Terror_msg)));


    emit log_error(error_msg);
this->disconnect();*/
}


bekomme ich folgende Fehlermeldung:

Code: Alles auswählen

/home/david/C++/QT-Projekts/Tlog_test/src/main.cpp:691: undefined reference to `vtable for Tlog_tester'
/home/david/C++/QT-Projekts/Tlog_test/src/main.cpp:691: undefined reference to `vtable for Tlog_tester'
/home/david/C++/QT-Projekts/Tlog_test/src/main.cpp:691: undefined reference to `vtable for Tlog_tester'
debug/main.o: In function `Tlog_tester':
/home/david/C++/QT-Projekts/Tlog_test/src/main.cpp:687: undefined reference to `vtable for Tlog_tester'
/home/david/C++/QT-Projekts/Tlog_test/src/main.cpp:687: undefined reference to `vtable for Tlog_tester'
collect2: ld returned 1 exit status
make[1]: *** [Tlog_test] Fehler 1
make[1]: Leaving directory `/home/david/C++/QT-Projekts/Tlog_test'
make: *** [debug] Fehler 2
Ich verwende Kdevelop. Ein einbinden der moc - Dateien war bislang nicht erforderlich.

Diese erscheint nicht mehr wenn ich Q_OBJECT einfach auskommentiere.
Aber dann dürfte das "signal-slot" Verfahren nicht mehr funktionieren.

Wie kommt es zu dieser Fehlermeldung ?
Zuletzt geändert von Bronski am 7. September 2009 21:21, insgesamt 1-mal geändert.
Mani99
Beiträge: 244
Registriert: 15. April 2009 10:46
Wohnort: München

Beitrag von Mani99 »

Führ doch einfach qmake auf das projekt aus, dann sollte es event. funktionieren!
Bronski
Beiträge: 44
Registriert: 10. Oktober 2008 13:46

Beitrag von Bronski »

Nein,
habe ich schon ausprobiert.
Ebenso:

make clean
qmake
make debug

Da fällt mir ein:
Der Fehler trat schon bei einer anderen Klasse auf,die ich aus einem anderen Projekt
kopiert hatte, die sich dort aber problemlos kompilieren ließ.
Ich brauchte in dieser Klasse QObject nicht so habe die Ableitung schlich auskommentiert.

Ich vermute,dass es mit der Konfiguration des Projektes zu tun hat.

Die Projekt-Datei mit der ich arbeite heißt Tlog_test.pro:

Code: Alles auswählen


TEMPLATE = app
TARGET = 
DEPENDPATH += . src
INCLUDEPATH += .

# Input
SOURCES += src/main.cpp
QT      += network sql xml
CONFIG  += debug_and_release

Es existiert im selben Verzeichnis noch die Datei tlog_test.pro
wobei ich nicht weiß ob sie automatisch generiert wurde oder ob sie von einem früheren Versuch stammt.

Das Programm bzw. Projekt heisst jedenfalls Tlog_test.

tlog_test.pro:

Code: Alles auswählen

SUBDIRS += src
TEMPLATE = subdirs 
CONFIG += warn_on \
          qt \
          thread 
Mani99
Beiträge: 244
Registriert: 15. April 2009 10:46
Wohnort: München

Beitrag von Mani99 »

Also bei

Code: Alles auswählen

class Tlog_tester;

class Tlog_tester:public QObject
{
kannst du das "class Tlog_tester;" raus nehmen, ist sinnlos!
Willi2793
Beiträge: 147
Registriert: 29. September 2008 10:59
Kontaktdaten:

Beitrag von Willi2793 »

versuch mal den DTOR explizit virtual zu machen.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Eine Q_OBJECT - Klasse braucht einen eigenen Header für moc.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Bronski
Beiträge: 44
Registriert: 10. Oktober 2008 13:46

Beitrag von Bronski »

Also mit:

Code: Alles auswählen

class Tlog_tester:public QObject
{

private:
Q_OBJECT
protected:
public:
Tlog_tester();
virtual ~Tlog_tester();
void start(Terror_log*);

//signals:

//void log_error( Terror_msg );


};
funktioniert es auch nicht.
Ich nehme an dass Du mit DTOR Destructor gemeint hast oder ?

Christian: Was meinst Du mit eigenem Header ?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Eine Klassendefinition sollte in einen Header sein - nicht im Sourcecode wie bei Dir. Dann in der pro-Datei HEADERS += meinHeader.h einfügen und es geht!
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Bronski
Beiträge: 44
Registriert: 10. Oktober 2008 13:46

Beitrag von Bronski »

Vielen Dank :D
Jetzt funktioniert es :!:

Nach dem ich die Klassendeklarationen in einem eigenen Header untergebracht habe funktioniert es.

Aber wieso :shock: :?:
Warum macht das für den Compiler einen Unterschied ?
Und wie kommt es dass es ihn in diesem Projekt stört und in einem anderen ,daß 10 mal umfangreicher ist,nicht :?:
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Wer lesen kann ist klar im Vorteil - das habe ich alles schon in meinen beiden vorigen Beiträgen erklärt... und wenn man nicht verstehen will was Q_OBJECT macht und wozu es gebraucht wird - naja.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Bronski
Beiträge: 44
Registriert: 10. Oktober 2008 13:46

Beitrag von Bronski »

Also was ich über Q_OBJECT zu wissen glaube:

Q_OBJECT ist ein Macro, das unter anderem das Signal-Slot Verfahren für die entsprechende Klasse ermöglicht.
Das heißt der Meta Object Compiler fügt im Nachhinein an dieser Stelle seinen eigenen Code ein.

Christian:
Du hast geschrieben, daß der MOC einen eigenen Header erwartet - und der Erfolg gibt dir Recht.

Dennoch in einem anderen Projekt habe ich 12 Klassen ,Definition und Deklaration in einer Datei, die alle Q_OBJECT verwenden.
Dieses Projekt läßt sich problemlos kompilieren.
Und ich frage mich wieso ?

Nochmals jedenfalls:
Euch allen vielen Dank für eure Bemühungen und Antworten
:)
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

as glaube ich nicht - moc geht zwar auch auf Sourcen aber da muss man etwas mehr tun... also ohne code glaube ich es nicht.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Bronski
Beiträge: 44
Registriert: 10. Oktober 2008 13:46

Beitrag von Bronski »

Christian Du hast recht. :oops:

Die Datei mit den 12 Klassen ist eine Header-Datei.
Das hatte ich gar nicht mehr auf dem Zeiger.
Das Projekt an dem ich momentan sitze ist sehr umfangreich, und die meisten Klassen lassen sich ohne das Zusammenspiel mit den anderen, und noch fehlender Klassen, noch nicht einmal testen.
Als ich jedoch eine Klasse in einem für sie geschriebenen Testprogramm testen wollte, habe ich sie aus Bequemlichkeit in eine cpp Datei kopiert - und mich dann gewundert warum derselbe Code nicht funktioniert.
Bis heute wußte ich auch nicht, daß das einen derart großen Unterschied macht.
Antworten