.dll
ou .so
sont des bibliothèques partagées (liées au moment de l'exécution), alors que .a
et .lib
est une bibliothèque statique (liée au moment de la compilation). Ce n'est pas une différence entre Windows et Linux.
La différence est, comment sont-elles gérées. Remarque: la différence ne concerne que les douanes, comment sont-elles utilisées. Il ne serait pas trop difficile de faire des builds Linux sur Windows et vice versa, sauf que pratiquement personne ne fait ça.
Si nous utilisons une DLL, ou si nous appelons une fonction même à partir de notre propre binaire, il existe un moyen simple et clair. Par exemple, en C, nous voyons que:
int example(int x) {
...do_something...
}
int ret = example(42);
Cependant, au niveau asm, il pourrait y avoir de nombreuses différences. Par exemple, sur x86, un call
opcode est exécuté et 42
est donné sur la pile. Ou dans certains registres. Ou n'importe où. Personne ne sait qu'avant d'écrire la DLL , comment elle sera utilisée. Ou comment les projets voudront l'utiliser, possible écrit avec un compilateur (ou dans un langage!) Qui n'existe même pas maintenant (ou est-il inconnu pour les développeurs de la dll).
Par exemple, par défaut, C et Pascal placent les arguments (et récupèrent les valeurs de retour) de la pile - mais ils le font dans un ordre différent . Vous pouvez également échanger des arguments entre vos fonctions dans les registres par une optimisation - dépendante du compilateur -.
Comme vous le voyez correctement, la coutume de Windows est que la construction d'une DLL, nous créons également un minimum .a
/ .lib
avec elle. Cette bibliothèque statique minimale n'est qu'un wrapper, les symboles (fonctions) de cette DLL sont atteints à travers elle. Cela permet d'effectuer les conversions d'appels de niveau asm requises.
Son avantage est la compatibilité. Son inconvénient est que si vous n'avez qu'un .dll, vous pouvez avoir du mal à comprendre comment ses fonctions doivent être appelées. Cela fait de l'utilisation des DLL une tâche de piratage, si le développeur de la DLL ne vous donne pas le.a
. Ainsi, il sert principalement à des fins de fermeture, par exemple, il est donc plus facile d'obtenir de l'argent supplémentaire pour les SDK.
Son autre inconvénient est que même si vous utilisez une bibliothèque dynamique, vous devez compiler statiquement ce petit wrapper.
Sous Linux, l'interface binaire des DLL est standard et suit la convention C. Ainsi, aucun .a
n'est requis et il existe une compatibilité binaire entre les bibliothèques partagées, en échange, nous n'avons pas les avantages de Microsoft Custom.