Erstellen einer Klassenbibliothek



  • Hi an alle,

    ich möchte wohl gerne eine Bibliothek programmieren.

    Also falls jemand Irrlicht kennt, so ungefähr möchte ich diese Bibliothek auch bauen, also von der Struktur her.

    Sprich ich habe verschiedene Klassen für die verschiedensten Aufgaben. Die möchte ich halt alle in ein Lib File packen und dann die Klassen nutzen wenn ich die Bibliothek einbinde.

    Die Bibliothek soll zu dem Plattformunabhängig sein bzw. auf Linux wie auf Windows implementierbar sein.

    Wie muss ich, wenn ich sämtliche Klassen erstellt habe, kompilieren?

    Unter Windows muss ich ja ein libfile sowie ein dll erstellen. Richtig?
    Muss es sich dabei um 2 verschiedene Arbeitsbereiche handeln?
    Kann ich das libfile auch ohne eine zusätzliche DLL erstellen oder ist dieses zwingend notwendig?

    Gibt es irgendwo ein gutes Tutorial oder ein Buch in dem das Erstellen von Bibliotheken gut erklärt wird? Wobei Tutorials momentan besser wären, da mein Budget für Bücher bereits überschritten ist:D.

    Gruß

    CrazyPlaya





  • Wie muss ich, wenn ich sämtliche Klassen erstellt habe, kompilieren?

    Kommt draufan wie Du exportierst.
    Meistens jedoch für jede Platform/Kompiler- Kombination.

    Unter Windows muss ich ja ein libfile sowie ein dll erstellen. Richtig?
    Muss es sich dabei um 2 verschiedene Arbeitsbereiche handeln?
    Kann ich das libfile auch ohne eine zusätzliche DLL erstellen oder ist dieses zwingend notwendig?

    Siehe Antworten unter dem Link im vorhergehenden Post.
    Zu den Arbeitsbereichen: Für z.B. Windows ergibt sich dann ein Arbeitsbereich (Projekt) und daraus resultieren dann ein LIB- und ein DLL File, sowie die Header- Files.

    Gibt es irgendwo ein gutes Tutorial oder ein Buch in dem das Erstellen von Bibliotheken gut erklärt wird? Wobei Tutorials momentan besser wären, da mein Budget für Bücher bereits überschritten ist:D.

    Schaue Dir doch eine existierende Library an, deren Source Code frei einsehbar ist.

    Simon



  • Öhm eigentlich relativ einfach:
    Du musst für jede Klasse 2 Header schreiben:
    1 Definition und 1 Implementation. In der Implementation dürfen nur pure virtual Methoden rein und die Constructor müssen auch dort aufgeführt werden, damit keine Daten davon exportiert werden müssen. Die Implementation implementiert nun dieses sogenannte Interface.

    class IBeispiel
    {
    public:
       IBeispiel() {}
    
       virtual BeispielMethode() = 0;
    };
    
    class CImplementation : public IBeispiel
    { 
    public:
       CImplementation() : IBeispiel() {}
    
       virtual BeispielMethode();
    };
    

    Nun brauchst du ein sogenanntes Device, über das du diese Klassen ansprichst, damit nach aussen hin nur über dieses Device auf die Klassen zugeriffen werden kannn. Da brauchst du auch 1 Interface und eine Implementation. Als bsp:

    class IDevice
    {
    public:
       IBeispiel* GetBeispiel();
    };
    
    class CDevice
    {
    public:
      IBeispiel* GetBeispiel() { return new CImplementation (); }
    };
    

    Nun brauchst du noch eine Funktion über die der AW eine Instanz von IDevice erhält. Die muss auch exportiert werden:

    #ifndef BUILD_DLL
    #define CALL __declspec (dllexport)
    #else
    #define CALL __declspec (dllimport)
    #endif
    
    IDevice* g_device = new CDevice();
    CALL IDevice* GetDevice()
    {
       return g_device;
    }
    

    Recht einfach huh?
    Edit:
    Das ist auf den Aufbau von irrlich bezogen.... sonst nix 😃
    rya.



  • Die Funktion für die Freigabe nicht vergessen.
    (Sollte in der Library impl. sein, bzw. am selben Ort wo auch das new stattfindet.)

    Edit:
    Zudem sollten, wegen des Namemanglings, die Funktionen um an ein Objekt zu kommen als C- Funktion exportiert werden.

    Simon



  • Oha ist ja doch komplizierter als ich dachte das ganze:D.

    Aber das von Scorcher klingt schon sehr gut, ich denke ich werde mir die Lib von Irrlicht mal genauer unter die Lupe nehmen. Diese Lib ist so aufgebaut wie Scrocher es beschreibt. Aber besten Dank an alle für die Ansätze.


Anmelden zum Antworten