Ich habe mich an einigen Diskussionen über Bibliotheken in 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 bei der Erstellung 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, so dass die Funktionen der Bibliothek für die aufrufende Anwendung immer verfügbar sind.
- Gemeinsam genutzte Objekte (.so-Dateien): Zum Zeitpunkt der Verknüpfung wird das Objekt lediglich anhand seiner API über die entsprechende Header-Datei (.h) überprüft. Die Bibliothek wird erst zur Laufzeit verwendet, wenn sie benötigt wird.
Der offensichtliche Vorteil statischer Bibliotheken besteht darin, dass sie es ermöglichen, die gesamte Anwendung in sich geschlossen zu halten, während der Vorteil dynamischer Bibliotheken darin besteht, dass die ".so"-Datei ersetzt werden kann (z. B. wenn sie aufgrund eines Sicherheitsfehlers aktualisiert werden muss), ohne dass die Basisanwendung neu kompiliert werden muss.
Ich habe gehört, dass einige Leute einen Unterschied zwischen Shared Objects und Dynamic Link Libraries (DLLs) machen, obwohl beides ".so"-Dateien sind. Gibt es einen Unterschied zwischen Shared Objects und DLLs, wenn es um die Entwicklung von C/C++ unter Linux oder einem anderen POSIX-kompatiblen Betriebssystem (z. B. MINIX, UNIX, QNX usw.) geht? Mir wurde gesagt, dass ein Hauptunterschied (bisher) darin besteht, dass Shared Objects nur zur Laufzeit verwendet werden, während DLLs zuerst mit dem Aufruf dlopen() innerhalb der Anwendung geöffnet werden müssen.
Schließlich habe ich von einigen Entwicklern gehört, dass sie von "Shared Archives" sprechen, die nach meinem Verständnis ebenfalls statische Bibliotheken sind, aber nie direkt von einer Anwendung verwendet werden. Stattdessen werden andere statische Bibliotheken gegen die "Shared Archives" gelinkt, um einige (aber nicht alle) Funktionen/Ressourcen aus dem Shared Archive in die zu erstellende statische Bibliothek zu ziehen.
Ich danke Ihnen allen im Voraus für Ihre Unterstützung.
Update
In dem Kontext, in dem mir diese Begriffe zur Verfügung gestellt wurden, handelte es sich tatsächlich um falsche Begriffe, die von einem Team von Windows-Entwicklern verwendet wurden, die Linux lernen mussten. Ich habe versucht, sie zu korrigieren, aber die (falschen) Sprachnormen blieben hängen.
- Gemeinsames Objekt: Eine Bibliothek, die beim Programmstart automatisch in ein Programm eingebunden wird und als eigenständige Datei existiert. Die Bibliothek wird zur Kompilierzeit in die Verknüpfungsliste aufgenommen (d.h.:
LDOPTS+=-lmylib
für eine Bibliotheksdatei mit dem Namenmylib.so
). Die Bibliothek muss zur Kompilierzeit und beim Start der Anwendung vorhanden sein. - Statische Bibliothek: Eine Bibliothek, die bei der Erstellung einer einzelnen (größeren) Anwendung in das eigentliche Programm eingebunden wird. Sie enthält den Anwendungscode und den Bibliothekscode, der automatisch in ein Programm gelinkt wird, wenn das Programm erstellt wird, und die endgültige Binärdatei, die sowohl das Hauptprogramm als auch die Bibliothek selbst enthält, existiert als einzelne, eigenständige Binärdatei. Die Bibliothek wird zur Kompilierzeit in die Linking-Liste aufgenommen (d.h.:
LDOPTS+=-lmylib
für eine Bibliotheksdatei mit dem Namenmylib.a
). Die Bibliothek muss zur Kompilierzeit vorhanden sein. - DLL: Im Wesentlichen dasselbe wie ein gemeinsam genutztes Objekt, aber anstatt zur Kompilierungszeit in die Verknüpfungsliste aufgenommen zu werden, wird die Bibliothek über
dlopen()
/dlsym()
Befehle, so dass die Bibliothek zur Kompilierungszeit nicht vorhanden sein muss, um das Programm zu kompilieren. Außerdem muss die Bibliothek nicht (unbedingt) beim Start der Anwendung oder beim Kompilieren vorhanden sein. da sie nur in dem Moment benötigt wird, in dem diedlopen
/dlsym
Anrufe getätigt werden. - Gemeinsames Archiv: Im Wesentlichen dasselbe wie eine statische Bibliothek, wird aber mit den Optionen "export-shared" und "
-fPIC
Flaggen". Die Bibliothek wird zur Kompilierzeit in die Verknüpfungsliste aufgenommen (d.h.:LDOPTS+=-lmylibS
für eine Bibliotheksdatei mit dem NamenmylibS.a
). Der Unterschied zwischen den beiden besteht darin, dass dieses zusätzliche Flag erforderlich ist, wenn ein gemeinsam genutztes Objekt oder eine DLL das gemeinsam genutzte Archiv statisch in den eigenen Code einbinden UND die Funktionen des gemeinsam genutzten Objekts anderen Programmen zur Verfügung stellen will, anstatt sie nur intern in der DLL zu verwenden. 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 Kompilierzeit vorhanden sein.
Zusätzliches Update
Die Unterscheidung zwischen " DLL
" und " shared library
" war nur eine (faule, ungenaue) Redewendung in dem Unternehmen, in dem ich damals arbeitete (Windows-Entwickler wurden gezwungen, auf Linux-Entwicklung umzusteigen, und der Begriff blieb hängen), die den oben genannten Beschreibungen entsprach.
Außerdem wird das nachgestellte " S
" nach dem Bibliotheksnamen war im Fall von "shared archives" nur eine Konvention, die in diesem Unternehmen und nicht in der Branche allgemein verwendet wurde.