c++ library-basiertes pluginsystem für mehrere plattformen



  • hi, ich hoffe der titel ist einigermaßen themenbezogen. ich habe bei meinem kleinen projekt vorgehabt statt einer hässlichen riesenklasse ein pluginsystem für textparserfuktionen aufzuziehen. in etwa soll das system so aussehen:

    class Base
    {
    public:
    	static char c; // some reference counter or whatever
    
    	int a, b;
    
    	Base()
    	{
    		c++;
    	}
    
    	virtual ~Base()
    	{
    		...
    	}
    
    	virtual void func()= 0;	 // this is an abstract base class
    };
    
    char Base::c= 0;
    
    // define an actual type of object with certain behavior
    class Derived: public Base
    {
    public:
    	Derived()
    	{
    		a= 3; b= 4;
    	}
    
    	virtual void func()
    	{
    		a= -1;
    	}
    };
    

    was ich jetzt wissen wollte ist aber. gibt es eine möglichkeit oder eine lib (die jemand gut findet) mit der ich plattformunabhängig dlls/sos etc laden kann? weil ich nicht auf makrocode-spielereien zurück greifen wollte. kann sowas evtl boost? oder gibts alternativen?



  • Sowas ist eigentlich gleich geschrieben. Windows: LoadLibrary, Linux: dlopen.
    stlplus hat ne Klasse "dynaload", welche das schon Plattformunabhängig anbietet. Nur hatte ich einige Probleme damit. Wurde nicht ausreichend auf Fehler geprüft, und hat ständig gesegfaulted 😃 Aber als Basis für eine eigene bessere Version sollte das allemal reichen.

    // edit:
    Ich hab nochmal kurz überlegt. Im Zusammenhang mit einer Factory-Methode, die in der plugin-dll lag (muss ja so sein), die mir ein Objekt lieferte, gab es nen Crash, da dynaload im Desctructor das Handle löscht und mein Objekt damit Hopps ging. Da hilft es z.B. die Handles+counter in ner statischen map zu speichern und Zerstörung nur über den LibLoader zu gestatten, der den entsprechenden Counter runter zählt und bei counter == 0 das Handle schließt.



  • plattformunabhängig geht schonmal garnicht. was geht ist, dass du was bastelst was auf einem OS compilerunabhängig funktioniert. dazu musst du dich aber auf ein reines C interface einschränken.


Anmelden zum Antworten