multiple metaObjects

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

multiple metaObjects

Beitrag von katz0r »

Hallo mal wieder.

mein Programm soll Plugins aus dynamischen Bibliotheken laden. Dazu habe ich eine Mutterklasse (cWorkerPlugin) erstellt. EIne Kindklasse (polarizer) soll von dieser Erben.
Die Plugins sollen eigene Parameter auf der Oberfläche des Programms darstellen können, dazu müssen sie natürlich auch slots haben um änderungen an den Parametern zu verarbeiten.

So weit so gut. jetzt will ich einen Plugin compilieren. Problem ist, dass der Compiler meint cWorkerPlugin::metaObject() const und ein paar andre metas wären mehrmals definiert :

Code: Alles auswählen

g++ -shared -Wl,-soname,libworker.so.1 -o libworker.so.1.0.0 polarizer.o cWorkerPlugin.o cDataManager.o moc_cWorkerPlugin.o moc_cDataManager.o moc_cWorkerPlugin.o   -L/usr/lib -L/usr/local/qwt/lib -lqwt -lQtGui -L/build/buildd/qt4-x11-4.2.0/lib -L/usr/X11R6/lib -laudio -lXt -lpng -lSM -lICE -lXrender -lXrandr -lXfixes -lXcursor -lXinerama -lfreetype -lXext -lX11 -lQtCore -lfontconfig -lz -lm -lglib-2.0 -ldl -lpthread 
moc_cWorkerPlugin.o: In function `cWorkerPlugin::metaObject() const':
moc_cWorkerPlugin.cpp:(.text+0x0): multiple definition of `cWorkerPlugin::metaObject() const'
moc_cWorkerPlugin.o:moc_cWorkerPlugin.cpp:(.text+0x0): first defined here
moc_cWorkerPlugin.o:(.data.rel.ro+0x0): multiple definition of `cWorkerPlugin::staticMetaObject'
moc_cWorkerPlugin.o:(.data.rel.ro+0x0): first defined here
moc_cWorkerPlugin.o: In function `cWorkerPlugin::qt_metacall(QMetaObject::Call, int, void**)':
moc_cWorkerPlugin.cpp:(.text+0x20): multiple definition of `cWorkerPlugin::qt_metacall(QMetaObject::Call, int, void**)'
moc_cWorkerPlugin.o:moc_cWorkerPlugin.cpp:(.text+0x20): first defined here
moc_cWorkerPlugin.o: In function `cWorkerPlugin::qt_metacast(char const*)':
moc_cWorkerPlugin.cpp:(.text+0x90): multiple definition of `cWorkerPlugin::qt_metacast(char const*)'
moc_cWorkerPlugin.o:moc_cWorkerPlugin.cpp:(.text+0x90): first defined here
collect2: ld returned 1 exit status
make: *** [libworker.so.1.0.0] Fehler 1
martin@martin:~/polarizersvn/polarizer/src$
die Mutterklasse sieht so aus :

Code: Alles auswählen

class cWorkerPlugin : public QObject
{
    Q_OBJECT;
    public :
        
        virtual ~cWorkerPlugin();
        
        QString name;
        ePluginType type;
	
	virtual void setupParams();
	virtual void work();

    public slots :
	virtual void sparam();
        
};
und die Kindklasse so

Code: Alles auswählen

class Polarizer : public cWorkerPlugin
{
public:
	
    //Zeiger auf den DataManager
    mainWindow *parent;
    cDataSeries ssigma, cu;
    
    Ui_Form *parameters;

	std::vector<double> pdcurve;

	Polarizer(mainWindow *owner);
	~Polarizer(void);
	
	void setupParams();
	void work();

	//ein paar interne prozeduren, nur zum rechnen da
	
public slots:
   //andere Slots die ich später nicht mehr brauche
    void sparam();
};
wo kommen jetzt blos die mehrfachen meta sachen her?

intressant ist auch, wenn ich die polarizer-Klasse direkt in mein projekt mit einkompiliere, also ohne Polymorhie arbeite, dann meint er trotzdem wenn ich einen slot verbinde cWorkerPlugin::slotname(bla) gäbs nicht (gibt es ja auch nicht) ich habe ja aber eine instanz von Polarizer will also Polarizer::slotname(bla) aufrufen.

Hat jemand ideen? Danke!

schönen Sonntag noch, Martin
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Du inkludierst die moc_foo.cpp - Datei in den Sourcen -> falsch wenn Du qmake benutzt.
MfG Christian

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

Beitrag von katz0r »

ahja...fast richtig, vielen Dank!!

ich hatte die Datei nicht includiert, aber in der .pro Datei bei den Sourcen mit hingeschrieben...jedenfalls hat er ja das objekt zweimal zum linker gegeben...

Danke nochmal, Martin
Antworten