.dll
lub .so
są udostępnionymi bibliotekami lib (połączonymi w czasie wykonywania), podczas gdy .a
i.lib
są biblioteką statyczną (połączoną w czasie kompilacji). Nie ma różnicy między Windows i Linux.
Różnica polega na tym, w jaki sposób są obsługiwane. Uwaga: różnica dotyczy tylko organów celnych, w jaki sposób są one wykorzystywane. Nie byłoby trudno stworzyć Linuksa w systemie Windows i odwrotnie, z tym że praktycznie nikt tego nie robi.
Jeśli używamy biblioteki dll lub wywołujemy funkcję nawet z własnego pliku binarnego, istnieje prosty i przejrzysty sposób. Na przykład w C widzimy, że:
int example(int x) {
...do_something...
}
int ret = example(42);
Jednak na poziomie asm może być wiele różnic. Na przykład na x86 call
wykonywany jest kod operacji, który 42
jest podawany na stosie. Lub w niektórych rejestrach. Lub gdziekolwiek. Nikt nie wie, że przed napisaniem biblioteki dll , w jaki sposób będzie ona używana. Lub w jaki sposób projekty będą chciały z niego korzystać, możliwe napisane przy pomocy kompilatora (lub w języku!), Który nawet nie istnieje (lub jest nieznany twórcom dll).
Na przykład domyślnie zarówno C, jak i Pascal umieszczają argumenty (i uzyskują wartości zwracane) ze stosu - ale robią to w innej kolejności . Możesz także wymieniać argumenty między funkcjami w rejestrach przez optymalizację zależną od kompilatora.
Jak widzisz poprawnie, niestandardowy system Windows polega na tym, że budując bibliotekę DLL, tworzymy również minimalny .a
/ .lib
za jej pomocą. Ta minimalna statyczna biblioteka jest tylko opakowaniem, poprzez które można uzyskać dostęp do symboli (funkcji) tej biblioteki DLL. To sprawia, że wymagane konwersje telefoniczne na poziomie asm.
Jego zaletą jest kompatybilność. Jego wadą jest to, że jeśli masz tylko plik .dll, możesz mieć trudności z ustaleniem, jak mają być wywoływane jego funkcje. To sprawia, że korzystanie z bibliotek DLL jest zadaniem hakującym, bibliotek jeśli programista biblioteki DLL nie daje takiej możliwości.a
. Służy więc głównie celom związanym z zamknięciem, na przykład łatwiej jest zdobyć dodatkową gotówkę na zestawy SDK.
Jego kolejną wadą jest to, że nawet jeśli używasz biblioteki dynamicznej, musisz skompilować to małe opakowanie statycznie.
W Linuksie interfejs binarny bibliotek DLL jest standardem i jest zgodny z konwencją C. Tak więc nie .a
jest wymagane i istnieje zgodność binarna między udostępnionymi bibliotekami, w zamian nie mamy zalet niestandardowego oprogramowania Microsoft.