Allg. Frage zu Bibliotheken bzw. zum linke von Bibliotheken



  • Hallo,

    ich arbeite jetzt schon ne ganze Zeit mit einem ganzen Haufen von selbst erstellten Bibliotheken, statische und dynamische sind dabei wild gemischt. Mich würde jetzt mal interessieren wann genau Bibliotheken zu Programmen/anderen Bibliotheken dazugelinkt werden. Gehen wir mal von folgendem Beispiel aus:

    B = Binärdatei
    S1 = statische Bibliothek
    S2 = statische Bibliothek

    B benutzt S1 und S1 benutzt S2

    Wird S2 jetzt erst zu S1 gelinkt wenn man B kompiliert oder schon wenn man S1 kompiliert? Muss ich beim kompilieren von B die Bibliotheken S1 und S2 angeben oder nur S1 (da ja S2 nur indirekt benutzt wird)?



  • BugJoe schrieb:

    ...Mich würde jetzt mal interessieren wann genau Bibliotheken zu Programmen/anderen Bibliotheken dazugelinkt werden....

    Genau dann, wenn Du es dem Linker sagst. 😉

    Der Linker will nur eines: Alle Objekteferenzen auflösen. ("Objektreferenzen" sind dabei Verweise auf Funktion, Daten, ....)
    Libs und "Object-Files" liefern den Bedarf Objektreferenzen (für die Objekte, die sie benutzen) als auch Objekte selbst (die sie implementieren).
    Erst wenn für jede Referenz ein passendes Objekt gefunden und erfolgreich mit ihm verbunden (="gelinkt") wurde, ist er zufrieden.

    Nun gibt es halt Methoden, solche Referenzen für den Linker "unsichtbar zu machen" und es dem Betriebssystem zur Laufzeit zu überlassen, diese "zu befriedigen" - das nennt man dann "dynamische Bibliothek" und braucht dementsprechend nicht dem Linker zur Verfügung gestellt werden.

    Gruß,

    Simon2.



  • Danke, ich glaub ich stand auch gerade etwas auf dem Schlauch. Beim erstellen von statischen Bibliotheken wird ja noch überhaupt gar nicht gelinkt. Gelinkt wird nur beim erstellen von Binärdateien und dynamischen Biblioteken richtig?



  • BugJoe schrieb:

    ...Beim erstellen von statischen Bibliotheken wird ja noch überhaupt gar nicht gelinkt...

    Doch - gibt's auch. Aber das "Linken" ist da sehr viel "rudimentärer": Es werden eigentlich nur die "Objects" in eine Datei mit einem compilerspezifischen Format zusammenkopiert. AFAIK werden da nichtmal Referenzen aufgelöst (bzw. nur "interne" also zu "static-Objekten").

    Wenn man später ein "executable" damit linken möchte, saugt sich der Linker die benötigen Objekte da heraus.

    Gruß,

    Simon2.



  • Ich hätte zu dem Thema noch mal kurz eine Frage. Ich gedenke wohl einen Teil meiner Diplomarbeit über Konzepte, Handhabung etc. von statischen/dynamischen Bibliotheken zu schreiben. Gibt es da gute Bücher welche dieses Thema abdecken?



  • Lang lang ists her, aber wieso einen neuen Thread auf machen wenn es schon einen gibt.

    Folgendes Phänomen:
    Wie eigentlich schon damals in meinem ersten Post. Ich erstelle meine statische Bibliothek A, welche die statische Bibliothek B verwendet. Wenn ich jetzt ein ausführbares Binary erstelle, welches eigentlich nur Bibliothek A verwenden soll, muss ich aber trotzdem noch Bibliothek B mit angeben da der Linker mäckert er kann die Referenzen zu dieser Bibliothek nicht auflösen.

    Das ganze passiert unter Linux mit dem GCC (g++). Ist das eine Eigenschaft des GCC oder ist das ein allg. Verhalten in C++? Ich hätte es halt gerne so, dass Bibliothek B schon bei der Erstellung von Bibliothek A zu dieser hinzu gelinkt wird, so dass ich Bibliothek B nicht mehr explizit bei der Kompilierung angeben muss wenn ich in einem Programm Bilbiothek A verwende.



  • BugJoe schrieb:

    Lang lang ists her, aber wieso einen neuen Thread auf machen wenn es schon einen gibt.

    Folgendes Phänomen:
    Wie eigentlich schon damals in meinem ersten Post. Ich erstelle meine statische Bibliothek A, welche die statische Bibliothek B verwendet. Wenn ich jetzt ein ausführbares Binary erstelle, welches eigentlich nur Bibliothek A verwenden soll, muss ich aber trotzdem noch Bibliothek B mit angeben da der Linker mäckert er kann die Referenzen zu dieser Bibliothek nicht auflösen.

    Das ganze passiert unter Linux mit dem GCC (g++). Ist das eine Eigenschaft des GCC oder ist das ein allg. Verhalten in C++? Ich hätte es halt gerne so, dass Bibliothek B schon bei der Erstellung von Bibliothek A zu dieser hinzu gelinkt wird, so dass ich Bibliothek B nicht mehr explizit bei der Kompilierung angeben muss wenn ich in einem Programm Bilbiothek A verwende.

    Eigentlich sollte eine Bibliothek B, die eine Bibliothek A statisch linkt, die Bilb. A komplett enthalten. Normalerweise solltest Du nur die Bibl. B benötigen.



  • Ja, so hab ich mir das eigentlich auch gedacht. Aber sobald ich mein Binary kompiliere meckert er dass er Referenzen zu Funktionen nicht auflösen kann die in Bibliothek B enthalten sind.

    Ich hab jetzt die Bibliothek A auch mal mit -static compiliert um sicher zu gehen, dass er auch nur die statischen Varianten verwendet, aber hat leider nichts gebracht.



  • Ach ja, was mir gerade aufgefallen ist...

    Ich benutze Eclipse + CDT Plugin. Und in den Projekteinstellungen für meine statische Bilbiothek A gibt es gar nicht die Möglichkeit andere Bibliotheken anzugeben 🙄 😕



  • Also mittlerweile hab ich folgendes heraus gefunden:

    • GCC (g++) linkt statische Bibliotheken generell nicht mit.
    • CL linkt statische Bibliotheken dann mit, wenn er sie findet. Sollte er sie nicht finden werden sie halt auch nicht mit gelinkt. Das ganze passiert aber stillschweigend, man weiß also letzten Endes nicht wirklich was er nun mit gelinkt hat und was nicht (wenn man nicht 100%ig weiß welche Methoden, etc. in welchen Bibliotheken enthalten sind).

    Ich persönlich finde dieses Verhalten (speziell vom GCC) blödsinnig. Was ist so schlimm daran in eine statische Bibliothek andere statische Bibliotheken mit zu linken? Weiß jemand ob man wenigstens dem CL mitteilen kann, dass er meckern soll wenn er einen Verweis nicht auflösen kann?

    PS: Es geht hier nur um die erstellung statischer Bibliotheken. Bei Binärdateien und dynamischen Bibliotheken ist das Verhalten zum Glück so wie es sein soll 😉



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Compiler- und IDE-Forum verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Anmelden zum Antworten