dlopen() und Templates [GELÖST]
-
Hallo zusammen,
ich verwende bisher dlopen() um Module zur Laufzeit zu laden.
(Da dlopen() Linux-spezifisch ist, hab ichs mal hier eingestellt)
Im Modul wird dann nach der Funktion "getIter" gesucht, die mit extern "C" definiert ist, um das Name Mangling von C++ zu umgehen.
Die Module rufen Iteratoren aus dem Hauptprogramm auf und übergeben dabei Funktionspointer, die die Ausgabe der Iteratoren beeinflussen.Im Modul sieht das ungefähr so aus (MyIterator erbt von der abstrakten Klasse Iterator):
bool eval(Iterator& iter) { return (iter[0] > 5); } extern "C" Iterator* getIter(){ return new MyIterator(eval); }
Hier sollen nur die Daten des Iterators berücksichtigt werden, deren erstes Feld größer als 5 ist.
So, jetzt würde ich gerne auf Templates umstellen, allerdings kommt mir hier das NameManglling in die Quere. Vorgestellt hab ich mir das ungefähr so:
class Eval{ bool eval(Iterator& iter) { return (iter[0] > 5); } }; extern "C" Iterator* getIter(){ return new MyIterator<Eval>(); }
Der Iterator ruft dann nicht mehr eval(), sondern Eval::eval() auf.
Kompilieren funktioniert, zur Laufzeit gibts einen symbol lookup error:
Modul.so: undefined symbol: _ZN10MyIteratorI4EvalEC1EP8Iteratorc++filt _ZN10MyIteratorI4EvalEC1EP8Iterator MyIterator<Eval>::MyIterator(Iterator*)
Gibts da einen Weg drumrum?
Im dlopen Mini Howto wird vorgeschlagen für Klassen eine gemeinsame Basisklasse zu erstellen und dafür dann entsprechende Funktionen zum Erstellen und Zerstören bereitzustellen, dann übergebe ich aber auch wieder Funktionspointer und keine Templates.Zum Schluß noch kurz eine Antwort auf das "Warum":
Ich erhoffe mir durch die Verwendung von Templates eine Laufzeitverbesserung, da der Compiler bei Templates mehr machen kann, als bei Funktionspointern. Dies trat in einer nicht-modularisierten Version auch ein.Viele Grüße,
Ataraxis
-
am besten ein ganzes beispiel machen
Ataraxis schrieb:
Zum Schluß noch kurz eine Antwort auf das "Warum":
Ich erhoffe mir durch die Verwendung von Templates eine Laufzeitverbesserung, da der Compiler bei Templates mehr machen kann, als bei Funktionspointern.also solange du dlopen nimmst, kommst du um funktionspointer nicht rum.
-
Hallo Greenthumb,
ich hab dlopen() zu Unrecht im Verdacht gehabt.
Die Variante mit Templates war in einem anderen Projekt und ich hatte die Templateklasse wie gewohnt in Definition und Implementation aufgeteilt.
Anscheinend darf man das bei Templateklassen anscheinend nicht.Jetzt funktioniert es.
Also zumindest mein Beispielprogramm, das ich hier anhängen wollte, im richtigen Projekt macht jetzt ein Destruktor Ärger, aber das gehört hier nicht hin.Viele Grüße,
Kai