Seite 1 von 1

keine vtable wenn ich Q_OBJECT einbinde

Verfasst: 22. Oktober 2006 11:40
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

Verfasst: 22. Oktober 2006 12:05
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

Verfasst: 22. Oktober 2006 12:20
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

Verfasst: 22. Oktober 2006 12:23
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.

Verfasst: 22. Oktober 2006 12:45
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!

Verfasst: 22. Oktober 2006 12:51
von Christian81
Nunja,qmake kann ja nicht wissen welche Header vion Dir sind und demnach muss man es angeben.