Name Mangling bei shared Objects [Gelöst]
-
Hi,
ich möchte ein shared object wie ein plugin meinem programm zur laufzeit hinzuladen. Dazu deklariere ich das Interface:
// Plugin.h class plugin { public: virtual void funct(Utils *utils) = 0; };
Weiterhin gibt es eine Klasse Utils aus dem Hauptprogramm die den plugins Funktionalitäten bereitstellt.
// Utils.h class Utils { public: void doit(); };
// Utils.cc void Utils::doit() { // do something }
Im shared object schliesslich gibt es die Klasse DirectPlugin
// DirectPlugin.h class DirectPlugin : public plugin { public: virtual void funct(Utils *utils); };
// DirectPlugin.cc // Um die Klasse über dlopen, dlsym laden zu können extern "C" { plugin *createPlugin() { return static_cast<plugin *>(new DirectPlugin()); } } void DirectPlugin::funct(Utils *utils) { utils->doit(); }
Im main programm sieht es dann so aus:
// Main.cctypedef plugin *(*createfp)(); int main(int argc, char** argv) { void *libraryHandle = 0; libraryHandle = dlopen("../libPlgin.so", RTLD_LAZY); createfp pluginCreator = (createfp)dlsym(libraryHandle, "createPlugin"); plugin *plgin = pluginCreator(); plgin->funct(new Utils()); }
Aber zur Laufzeit bekomme ich dann folgenden Fehler von dlopen zurück:
../libPlgin.so: undefined symbol: _ZN5Utils4doitEv
Kann jemand helfen?
Vielen Dank
-
-rdynamic
sollte helfen (GCC-flag)
-
Klappt tatsächlich.
Vielen Dank!