Ich war an einigen Debatten über Bibliotheken unter Linux beteiligt und möchte einige Dinge bestätigen.
Nach meinem Verständnis (bitte korrigieren Sie mich, wenn ich falsch liege und ich werde meinen Beitrag später bearbeiten) gibt es zwei Möglichkeiten, Bibliotheken beim Erstellen einer Anwendung zu verwenden:
- Statische Bibliotheken (.a-Dateien): Zum Zeitpunkt der Verknüpfung wird eine Kopie der gesamten Bibliothek in die endgültige Anwendung eingefügt, sodass die Funktionen in der Bibliothek der aufrufenden Anwendung immer zur Verfügung stehen
- Freigegebene Objekte (.so-Dateien): Zum Zeitpunkt der Verknüpfung wird das Objekt nur über die entsprechende Header-Datei (.h) anhand seiner API überprüft. Die Bibliothek wird erst zur Laufzeit verwendet, wenn sie benötigt wird.
Der offensichtliche Vorteil statischer Bibliotheken besteht darin, dass die gesamte Anwendung in sich geschlossen sein kann, während dynamische Bibliotheken den Vorteil haben, dass die ".so" -Datei ersetzt werden kann (dh, falls sie aus Sicherheitsgründen aktualisiert werden muss Fehler), ohne dass die Basisanwendung neu kompiliert werden muss.
Ich habe gehört, dass einige Leute zwischen gemeinsam genutzten Objekten und dynamisch verknüpften Bibliotheken (DLLs) unterscheiden, obwohl beide ".so" -Dateien sind. Gibt es einen Unterschied zwischen gemeinsam genutzten Objekten und DLLs, wenn es um die C / C ++ - Entwicklung unter Linux oder einem anderen POSIX-kompatiblen Betriebssystem (z. B. MINIX, UNIX, QNX usw.) geht? Mir wurde gesagt, dass ein wesentlicher Unterschied (bis jetzt) darin besteht, dass gemeinsam genutzte Objekte nur zur Laufzeit verwendet werden, während DLLs zuerst mit dem Aufruf dlopen () in der Anwendung geöffnet werden müssen.
Schließlich habe ich auch gehört, dass einige Entwickler "gemeinsam genutzte Archive" erwähnt haben, die meines Wissens auch selbst statische Bibliotheken sind, aber niemals direkt von einer Anwendung verwendet werden. Stattdessen werden andere statische Bibliotheken mit den "gemeinsam genutzten Archiven" verknüpft, um einige (aber nicht alle) Funktionen / Ressourcen aus dem gemeinsam genutzten Archiv in die zu erstellende statische Bibliothek zu ziehen.
Vielen Dank im Voraus für Ihre Hilfe.
Aktualisieren
In dem Kontext, in dem mir diese Begriffe zur Verfügung gestellt wurden, handelte es sich tatsächlich um fehlerhafte Begriffe, die von einem Team von Windows-Entwicklern verwendet wurden, die Linux lernen mussten. Ich habe versucht, sie zu korrigieren, aber die (falschen) Sprachnormen sind geblieben.
- Freigegebenes Objekt: Eine Bibliothek, die beim Programmstart automatisch mit einem Programm verknüpft wird und als eigenständige Datei vorhanden ist. Die Bibliothek wird zur Kompilierungszeit in die Verknüpfungsliste aufgenommen (dh
LDOPTS+=-lmylib
für eine Bibliotheksdatei mit dem Namenmylib.so
). Die Bibliothek muss zur Kompilierungszeit und beim Start der Anwendung vorhanden sein. - Statische Bibliothek: Eine Bibliothek, die beim Erstellen für eine einzelne (größere) Anwendung, die den Anwendungscode und den Bibliothekscode enthält, der beim Erstellen des Programms automatisch mit einem Programm verknüpft wird, und die endgültige Binärdatei, die beide enthält, mit dem eigentlichen Programm selbst zusammengeführt wird Das Hauptprogramm und die Bibliothek selbst existieren als einzelne eigenständige Binärdatei. Die Bibliothek wird zur Kompilierungszeit in die Verknüpfungsliste aufgenommen (dh
LDOPTS+=-lmylib
für eine Bibliotheksdatei mit dem Namen mylib.a). Die Bibliothek muss zur Kompilierungszeit vorhanden sein. - DLL: Entspricht im Wesentlichen einem gemeinsam genutzten Objekt, wird jedoch nicht zur Kompilierungszeit in die Verknüpfungsliste aufgenommen, sondern über
dlopen()
/dlsym()
-Befehle geladen , sodass die Bibliothek zum Zeitpunkt der Kompilierung nicht vorhanden sein muss, damit das Programm kompiliert werden kann. Außerdem muss die Bibliothek beim Start der Anwendung oder beim Kompilieren nicht (unbedingt) vorhanden sein , da sie nur zum Zeitpunkt des Aufrufs vondlopen
/ benötigt wirddlsym
. - Shared Archive: Entspricht im Wesentlichen einer statischen Bibliothek, wird jedoch mit den Flags "export-shared" und "-fPIC" kompiliert. Die Bibliothek wird zur Kompilierungszeit in die Verknüpfungsliste aufgenommen (dh
LDOPTS+=-lmylibS
für eine Bibliotheksdatei mit dem NamenmylibS.a
). Der Unterschied zwischen beiden besteht darin, dass dieses zusätzliche Flag erforderlich ist, wenn ein gemeinsam genutztes Objekt oder eine gemeinsam genutzte DLL das gemeinsam genutzte Archiv statisch mit seinem eigenen Code verknüpfen UND die Funktionen im gemeinsam genutzten Objekt anderen Programmen zur Verfügung stellen möchte, anstatt sie nur zu verwenden intern in der DLL. Dies ist nützlich, wenn Ihnen jemand eine statische Bibliothek zur Verfügung stellt und Sie diese als SO neu verpacken möchten. Die Bibliothek muss zur Kompilierungszeit vorhanden sein.
Zusätzliches Update
Die Unterscheidung zwischen " DLL
" und " shared library
" war nur eine (faule, ungenaue) Umgangssprache in dem Unternehmen, in dem ich zu der Zeit gearbeitet habe (Windows-Entwickler mussten zur Linux-Entwicklung wechseln, und der Begriff blieb hängen), wobei die oben genannten Beschreibungen eingehalten wurden.
Darüber hinaus war das nachgestellte " S
" Literal nach dem Bibliotheksnamen im Fall von "gemeinsam genutzten Archiven" nur eine Konvention, die in diesem Unternehmen und nicht in der Branche im Allgemeinen verwendet wurde.
.a
Dateien steht das "a" tatsächlich für "archove" und ist einfach ein Archiv von Objektdateien. Moderne Linker sollten gut genug sein, um nicht die while-Bibliothek, sondern nur die benötigten Objektdateien im Archiv enthalten zu müssen, und möglicherweise sogar nur die Codeabschnitte / Datenabschnitte in den Objektdateien, auf die verwiesen wird.