Name Mangling Problem



  • hi,

    folgender Code:

    class foobar
    {
    }
    
    // Plugin Interface
    class IPluginInterface : public foobar // foobar soll nicht gemagelt werden
    {
     // BLA
    }
    
    // Plugin Klasse
    class PScreenSaver : public IPluginInterface
    {
     // BLA
    }
    
    extern "C" IPluginInterface* create() { // das wird mit dlsym geholt
        return new PScreenSaver;
    }
    

    foobar wird hier leider gemagelt also es wird daraus §foobar§$%"@ somit bekomm ich ein relocation error beim Start des Programmes.
    Wenn ich public foobar rausnehme habe ich keine Probleme.
    Mit extern "C" schalte ich das mname mangling ja ab aber wie schaff ich das hier?

    MFG
    xmarvel



  • mir ist was erstaunliches aufgefallen! 😮
    Wenn ich die Klasse foobar in der selben header Datei schreibe wo die Interface Klasse ist dann hat er das Problem nicht mehr!

    Allerding wenn ich die Klasse foobar auslagere in eine andere Header(Datei) dann kommt der Fehler wieder zurück Wie kann sowas sein? 😕

    Hab in jeder Header folgendes stehen.

    #ifndef DATEINAME_H
    #define DATEINAME_H
     //...
    #endif
    

    also mehrfach inkluden eigentlich ausgeschlossen.
    Hab jetzt auch herasugefunden wie man das gemagelt symbol _ZN6foobarC2Ev in Klartext anzeigen kann mittels c++filt
    Also der Fehler bei mir bedeutet: foobar::foobar[not-in-charge]()
    Hoffe einer kann mir das erklären wieso das in einer anderen Datei nicht funtkioniert?

    EDIT: die include Anweisungen sind alle korrekt gesetzt.

    MFG
    xmarvel



  • du mußt extern "C" vor den prototypen von create() im header setzten und nicht nur vor die implementation! sonst weiß dein compiler zwar bei der datei, in der create() implementiert ist, daß er nicht mangeln soll, aber in anderen dateien sieht er nur deinen prototypen IPluginInterface create()* und mangelt doch. also extern "C" vor den prototypen im header, so daß ein compiler bei jedem funktionsaufruf in quellen, die den header mit dem proto includen, weiß, das er nicht mangeln soll.


Anmelden zum Antworten