Wie verknüpfen statische Bibliotheken Abhängigkeiten?
Lesezeit: 2 Minuten
jmasterx
Angenommen, ich habe libA. Es hängt zum Beispiel von libSomething ab, weil eine Nicht-Inline-Methode von libA eine Methode in libSomething.h aufruft. Wie hängt in diesem Fall die Abhängigkeit zusammen? Muss libA statisch mit libSomething verknüpfen, wenn es kompiliert wird, oder muss ein Benutzer von libA (einer Anwendung, die libA verwendet) sowohl mit libA als auch mit libSomething verknüpfen?
Vielen Dank
Reben
Beim statischen Linken werden lediglich die gesamten Elemente (Funktionen, Konstanten usw.) in die resultierende ausführbare Datei kopiert. Wenn der Code einer statischen Bibliothek Verweise auf einige gemeinsam genutzte Bibliothekselemente enthält, werden diese Verweise zu Abhängigkeiten in der resultierenden ausführbaren Datei. Dasselbe gilt, wenn Sie eine Bibliothek anstelle einer ausführbaren Datei verknüpfen.
Dieser Faden beschreibt, wie es unter Linux passiert.
Was kann ich tun, wenn ich nicht möchte, dass die resultierende ausführbare Datei die Last trägt?
– jmasterx
20. Oktober 2011 um 20:47 Uhr
@Milo: Sie könnten die statischen Bibliotheken der Abhängigkeiten von libSomthing in libA verlinken.
– Benjamin Bannier
20. Oktober 2011 um 20:51 Uhr
@Milo: dh Sie möchten keine gemeinsamen Abhängigkeiten? Dann müssen Sie nur alles statisch verknüpfen und nur statische Bibliotheken verwenden. Dies führt zu einer großen eigenständigen ausführbaren Datei ohne Abhängigkeiten. Aber seien Sie gewarnt, es ist schwierig, einige Bibliotheken statisch zu erstellen.
– Reben
20. Oktober 2011 um 20:53 Uhr
Eine statische Bibliothek ist mehr oder weniger ein einfaches Archiv nicht verknüpfter binärer Objektdateien (*.o oder *.obj), beim Kompilieren des Archivs wird nicht auf Abhängigkeiten geprüft. Wenn man seine ausführbare Binärdatei (oder gemeinsam genutzte Bibliothek / DLL) verknüpft hat, prüft der Linker alle erforderlichen Abhängigkeiten und warnt Sie erst dann bei Problemen.
Während des Erstellungsprozesses übersetzt der Compiler Code in ein temporäres Format, nennen wir es eine Objektdatei. In der Objektdatei gibt es eine Liste von Symbolen, die der Compiler nicht auflösen konnte, normalerweise Definitionen an anderer Stelle. Die Verknüpfungsphase ist für die Auflösung dieser Symbole zuständig.
Der Erstellungsprozess führt dem Linker Dateien zu, bis alle Symbole aufgelöst sind. Es gibt keine physikalischen Abhängigkeitslisten, nur Listen von aufzulösenden Symbolen. Dadurch können Symbole durch die Verwendung verschiedener Bibliotheken aufgelöst werden. Zum Beispiel möchte man vielleicht eine Windows-Bibliothek für Windows-spezifische Probleme verwenden; eine Linux-Bibliothek für Linux-spezifische Probleme. Dies besagt nicht ausdrücklich, dass ein Programm von einer Windows-Bibliothek abhängig ist; es könnte auch vom Linux abhängig sein.
Einige Compiler können Abhängigkeitslisten generieren, normalerweise zur Verwendung in einem Build-Prozess. Die letztendliche Verantwortung liegt jedoch beim Programmierer.