Bibliothek-Aufbau



  • Ich möchte meine eigene Bibliothek aufbauen, aber ich weiß nicht wie der generelle Aufbau ist, selbst in C++-Büchern wird das so nicht behandelt.

    Ich denke ich habe eine Datei mit Prototypen: main.hpp (kompiliert .gch)
    und eine mit den eigentlichen Methoden: main.cpp.

    Meine Frage ist jetzt allerdings: wenn ich jetzt die main.hpp in mein programm einbinde, wird die kompilierte main.cpp einfach rausgesucht vom compiler oder muss ich die im header(main.hpp) angeben?

    und wie funktioniert das mit dlls? das selbe prinzip?

    ich hab bisher einfach alles in die .hpp gepackt und diese dann eingebunden, aber das ist wohl nicht ganz richtig. Funktioniert, aber wie wird das normalerweise gehandhabt?



  • Kommt darauf an, welche Art von Bibliothek du aufbauen möchtest.
    Es gibt statische Bibliotheken (.lib), deren Code mit der Anwendung gelinkt werden, damit hat die Anwendung keine weiteren Abhängigkeiten.
    Dann gibt des dynamische Bibliotheken (.dll), die zur Laufzeit von der Anwendung nachgeladen werden. Die DLL wird von der Anwendung benötigt und zur Laufzeit zur Verfügung stehen.


  • Mod

    Mit deiner Headertechnik wirst du sehr bald scheitern, denn das geht schief, sobald der Anwender den Header in mehr als einer Quellcodedatei benutzt.

    Wie es eigentlich geht, wird schnell betriebssystemabhängig.

    Die Grundidee ist, dass es gewisse Verzeichnisse im System gibt, in denen der Compiler nach Headern sucht (In unixartigen Systemen meist etwas wie /usr/include), und andere Verzeichnisse, in denen der Linker nach übersetztem Bibliothekscode sucht (In unixartigen so etwas wie /usr/lib). Jetzt willst du halt deinen Header in das Headerverzeichnis bekommen, und deinen Code übersetzen und in das Bibliotheksverzeichnis bekommen. Oder die Liste der Verzeichnisse in denen gesucht wird (es ist nämlich eigentlich gleich eine ganze Liste, nicht nur jeweils eines), mit den Verzeichnissen erweitern, wo dein Zeug liegt.

    Dieser Gesamtvorgang ist es, was man allgemein als "Installation" einer Software/Bibliothek bezeichnet.

    Und wie du sicher weist, wenn du mal auf verschiedenen Systemen gearbeitet hast, geschieht das Installieren von Software jeweils sehr unterschiedlich, und oft gibt es auch gleich mehrere Wege. Zum Beispiel in Linuxen klassisch aus dem Nichts über configure/make/make install, oder aber gleich über einen komplett integrierten Paketmanager. Entsprechend ist es nicht leicht, ein allgemeines Rezept anzugeben. Zumal der komplette Vorgang aus jeweils nicht-trivialen Einzelschritten besteht: Code übersetzen, Ergebnis verteilen, Ergebnis an den richtigen Ort bringen. Und selbst das ist nicht notwendigerweise die einzig wahre Vorgehensweise, denn "Code verteilen, Code übersetzen, Ergebnis an den richtigen Ort bringen" ist genauso legitim und ein ganz anderer Vorgang

    Es gibt zwar ein paar Werkzeuge, die versuchen, das ganze halbwegs zu vereinheitlichen. Die verlangen aber oft eher viel vom Endanwender, weil sie erstens dicke Abhängigkeiten haben, und zweitens ist die Vereinheitlichung meist von der Form, eine linuxartige Installation auf anderen Systemen zu ermöglichen, was nicht jedermanns Sache ist.

    Am besten sagst du mal ein Betriebssystem an, für das wir konkretere Tipps geben sollen, und am besten noch eine Kurzbeschreibung, wie du normalerweise dort Software/Bibliotheken installierst, und ob du diese Methode imitieren möchtest.

    PS: Wichtig: Ich sollte noch betonen, dass die ganze Verkomplizierung davon kommt, wenn man den Code auf fremden Computern lauffähig machen möchte. Wenn du einfach nur für dich alleine deine eigene Bibliothek "installieren" möchtest, dann ist die Sache nahezu trivial, weil es mit dem Kopieren von ein paar Dateien und/oder ändern von ein paar Umgebungsvariablen getan ist.



  • @jaredgerald sagte in Bibliothek-Aufbau:

    Ich denke ich habe eine Datei mit Prototypen: main.hpp (kompiliert .gch)
    und eine mit den eigentlichen Methoden: main.cpp.

    main.cc sollte gerade nicht in einer Bibliothek auftauchen. Die main Funktion wird ja gerade von der Anwendung zur Verfügung gestellt. Nenne das besser jaredgerald_bibliothek_teil1.cc usw.

    Meine Frage ist jetzt allerdings: wenn ich jetzt die main.hpp in mein programm einbinde, wird die kompilierte main.cpp einfach rausgesucht vom compiler oder muss ich die im header(main.hpp) angeben?

    Beim Übersetzen musst Du nur den Pfad für die Header Dateien angeben, beim Linken des Programms muss man die Library und ggf. den Pfad angeben.

    und wie funktioniert das mit dlls? das selbe prinzip?

    Meistens muss man dazu den Code für die Library bereits mit speziellen Flags (auf UNIX/Linux mit GCC -fPIC) übersetzen und um dann ein DSO zu generieren der Linker erhält da spezielle Anweisungen, das ist im höchsten Maß von der verwendete Plattform abhängig. Windows mag da spezielle Eigenheiten haben, die es auf anderen Plattformen nicht gibt.



  • Ich bin im Prinzip Hobby-Programmierer. Ich hab mir bisher eine "Bibliothek" für Verzeichnisbehandlung,generische Methoden, für Dateien, für Verschlüsselung etc. gemacht. Alles in eine .hpp gepackt mit Prototypen und den Methoden.

    Dazu noch ein kleineres "Launcher-Projekt". Ich möchte allerdings meine "großen Bibliotheken" wie Datei, Verzeichnis, Verschlüsselung, generische Methoden etc. so "vorkompilieren", dass Sie für jedes Projekt verfügbar sind.

    Wie gesagt ich bin eigentlich noch Anfänger. Vielleicht drücke ich mich auch nicht richtig aus.

    Ich arbeite in Windows mit dem Dev-Cpp Compiler von Bloodshet und steige jetzt auf Visual Studio um.

    Das sind im Prinzip "kleinere Bibliotheken". Möchte aber noch weitere und vielleicht noch an größeren Bibliotheken arbeiten und diese vielleicht auch auf andere Systeme portieren.

    Mit "fremden" Bibliotheken hab ich im Prinzip keine Erfahrung. Ich binde im Prinzip bisher nur fremde hpp's ein, aber habe vor kurzem mit Java angefangen und das mit den Umgebungsvariablen "installiert".

    Fürs erste reicht mir vielleicht eine kurze Erklärung für Windows.





  • Nutzt du CMake? Oder ein anderes Build System?


Anmelden zum Antworten