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: _ZN5Utils4doitEvKann jemand helfen?
Vielen Dank
-
-rdynamicsollte helfen (GCC-flag)
-
Klappt tatsächlich.
Vielen Dank!