Seite 1 von 1

[gelöst] Probleme mit Q_OBJECT

Verfasst: 7. September 2009 12:01
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 ?

Verfasst: 7. September 2009 12:51
von Mani99
Führ doch einfach qmake auf das projekt aus, dann sollte es event. funktionieren!

Verfasst: 7. September 2009 14:33
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 

Verfasst: 7. September 2009 14:46
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!

Verfasst: 7. September 2009 15:13
von Willi2793
versuch mal den DTOR explizit virtual zu machen.

Verfasst: 7. September 2009 15:40
von Christian81
Eine Q_OBJECT - Klasse braucht einen eigenen Header für moc.

Verfasst: 7. September 2009 17:08
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 ?

Verfasst: 7. September 2009 17:17
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!

Verfasst: 7. September 2009 18:32
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 :?:

Verfasst: 7. September 2009 18:43
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.

Verfasst: 7. September 2009 19:30
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
:)

Verfasst: 7. September 2009 19:32
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.

Verfasst: 7. September 2009 21:20
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.