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.cc

    typedef 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!


Anmelden zum Antworten