.dll
oder .so
sind gemeinsam genutzte Bibliotheken (zur Laufzeit verknüpft), während .a
und .lib
eine statische Bibliothek ist (zur Kompilierungszeit verknüpft). Dies ist kein Unterschied zwischen Windows und Linux.
Der Unterschied ist, wie sie behandelt werden. Hinweis: Der Unterschied besteht nur im Zoll, wie werden sie verwendet. Es wäre nicht allzu schwer, Linux-Builds auf Windows-Art und umgekehrt zu erstellen, außer dass dies praktisch niemand tut.
Wenn wir eine DLL verwenden oder eine Funktion sogar aus unserer eigenen Binärdatei aufrufen, gibt es einen einfachen und klaren Weg. In C sehen wir zum Beispiel Folgendes:
int example(int x) {
...do_something...
}
int ret = example(42);
Auf asm-Ebene kann es jedoch viele Unterschiede geben. Auf x86 wird beispielsweise ein call
Opcode ausgeführt und der 42
auf dem Stapel angegeben. Oder in einigen Registern. Oder irgendwo. Niemand weiß, bevor er die DLL schreibt , wie sie verwendet wird. Oder wie die Projekte es verwenden wollen, möglicherweise mit einem Compiler (oder in einer Sprache!) Geschrieben, der noch nicht einmal existiert (oder für die Entwickler der DLL unbekannt ist).
Standardmäßig setzen sowohl C als auch Pascal die Argumente (und erhalten die Rückgabewerte) vom Stapel - aber sie tun dies in einer anderen Reihenfolge . Sie können auch Argumente zwischen Ihren Funktionen in den Registern durch eine vom Compiler abhängige Optimierung austauschen.
Wie Sie richtig sehen, ist der Windows-Brauch, dass beim Erstellen einer DLL auch ein Minimal .a
/ .lib
damit erstellt wird. Diese minimale statische Bibliothek ist nur ein Wrapper, über den die Symbole (Funktionen) dieser DLL erreicht werden. Dadurch werden die erforderlichen Aufrufkonvertierungen auf ASM-Ebene durchgeführt.
Ihr Vorteil ist die Kompatibilität. Der Nachteil ist, dass es schwierig sein kann, herauszufinden, wie die Funktionen aufgerufen werden sollen, wenn Sie nur eine DLL haben. Dies macht die Verwendung von DLLs zu einer Hacking-Aufgabe, wenn der Entwickler der DLL Ihnen die nicht gibt.a
. So dient es hauptsächlich Schließungszwecken, zum Beispiel ist es einfacher, zusätzliches Geld für die SDKs zu erhalten.
Ein weiterer Nachteil ist, dass Sie diesen kleinen Wrapper statisch kompilieren müssen, selbst wenn Sie eine dynamische Bibliothek verwenden.
Unter Linux ist die binäre Schnittstelle der DLLs Standard und folgt der C-Konvention. Daher ist kein .a
erforderlich und es besteht eine binäre Kompatibilität zwischen den gemeinsam genutzten Bibliotheken. Im Gegenzug haben wir nicht die Vorteile des Microsoft Custom.