keine vtable wenn ich Q_OBJECT einbinde

Alles rund um die Programmierung mit Qt
Antworten
katz0r
Beiträge: 16
Registriert: 22. Oktober 2006 11:34

keine vtable wenn ich Q_OBJECT einbinde

Beitrag von katz0r »

Hallo allerseits,

ich habe eine Klasse, die einen Slot haben soll. Dazu muss ich das Makro Q_OBJECT ganz oben reinschreiben. Das Problem ist, sobald ich das mache findet der Linker keine vtable mehr für diese klasse!?

hier ein paar schnippsel :

Code: Alles auswählen

#include <QtCore>
#include <QtGui>
#include <QObject>

//[...]

class cDataManager : public QObject
{
    Q_OBJECT
	public:
		DMAN_MAP_TYPE data;
		mainWindow* owner;
		
		cDataManager(mainWindow *parent);
		~cDataManager();		
		
		void addDataSeries(cDataSeries dat);
		
		void removeDataSeries(QString key);
		
	public slots:
		void changeValue(int row, int column);
};
und wenn ich das ganze compilieren will kommt beim linken :

Code: Alles auswählen

g++  -o app main.o cDataManager.o mainWindow.o polarizer.o    -L/usr/lib -lQtGui -L/build/buildd/qt4-x11-4.2.0/lib -L/usr/X11R6/lib -L/usr/local/qwt/lib -laudio -lXt -lpng -lSM -lICE -lXrender -lXrandr -lXfixes -lXcursor -lXinerama -lfreetype -lXext -lX11 -lQtCore -lfontconfig -lz -lm -lglib-2.0 -ldl -lpthread -lqwt
cDataManager.o: In function `cDataManager::cDataManager(mainWindow*)':
cDataManager.cpp:(.text+0xb0): undefined reference to `vtable for cDataManager'
cDataManager.o: In function `cDataManager::cDataManager(mainWindow*)':
cDataManager.cpp:(.text+0x100): undefined reference to `vtable for cDataManager'
cDataManager.o: In function `cDataManager::~cDataManager()':
cDataManager.cpp:(.text+0x3da): undefined reference to `vtable for cDataManager'
cDataManager.o: In function `cDataManager::~cDataManager()':
cDataManager.cpp:(.text+0x49a): undefined reference to `vtable for cDataManager'
cDataManager.o: In function `cDataManager::~cDataManager()':
cDataManager.cpp:(.text+0x52a): undefined reference to `vtable for cDataManager'
collect2: ld returned 1 exit status
make: *** [app] Fehler 1
seltsam ist auch, dass der den Fehler dreimal für meinen Destructor anzeigt...dabei hab ich den doch blos einmal implementiert ;-)

wenn ich das makro rausnehme kompiliert er brav aber der slot wird halt zur laufzeit nicht gefunden.
für anregungen bin ich dankbar! Martin
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Standardproblem - dir fehlt moc (die Forumsuche wäre in einem solchen Fall sehr ergiebg). Wenn man eine pro-Datei & qmake benutzt macht qmake dies automatisch. Ansonsten -> DOKU
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
katz0r
Beiträge: 16
Registriert: 22. Oktober 2006 11:34

Beitrag von katz0r »

mhh, ja es geht wenn ich die klasse vorher durch den moc jage

aber ich benutze qmake und ne .pro datei, allerdings ist die .pro datei selber gebastelt

Code: Alles auswählen

 TEMPLATE    = app

 FORMS       = untitled.ui

 SOURCES     = main.cpp cDataManager.cpp mainWindow.cpp polarizer.cpp
soll da noch was andres rein?
make rufe ich von Hand auf, kann qmake das auch? liegt es vielleicht daran?

vielen Dank für die Antwort!, Martin
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Wenn du Q_OBJECT erst nachträglich einfügst, musst Du nochmal qmake aufrufen damit es die Header neu parsen kann. Ausserdem muss dann auch "HEADERS += deinHeader.h" mit in die pro-Datei rein.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
katz0r
Beiträge: 16
Registriert: 22. Oktober 2006 11:34

Beitrag von katz0r »

ahja, herrlich jetzt geht es

so cool, dass es anhand der hässlichen Syntax meine Selbstgebauten header erkennt ist qmake wohl doch nicht ;-)

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

Beitrag von Christian81 »

Nunja,qmake kann ja nicht wissen welche Header vion Dir sind und demnach muss man es angeben.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Antworten