.dll
o .so
sono librerie condivise (collegate in runtime), mentre .a
ed .lib
è una libreria statica (collegata in fase di compilazione). Questa non è una differenza tra Windows e Linux.
La differenza è, come vengono gestiti. Nota: la differenza sta solo nella dogana, come vengono utilizzati. Non sarebbe troppo difficile realizzare build Linux su Windows e viceversa, tranne che praticamente nessuno lo fa.
Se usiamo una dll o chiamiamo una funzione anche dal nostro binario, c'è un modo semplice e chiaro. Ad esempio, in C, vediamo che:
int example(int x) {
...do_something...
}
int ret = example(42);
Tuttavia, a livello di asm, potrebbero esserci molte differenze. Ad esempio, su x86, call
viene eseguito un codice operativo, che 42
viene indicato nello stack. O in alcuni registri. O ovunque. Nessuno lo sa prima di scrivere la dll , come verrà usata. O come i progetti vorranno utilizzarlo, possibile scritto con un compilatore (o in una lingua!) Che non esiste nemmeno adesso (o è sconosciuto per gli sviluppatori della dll).
Ad esempio, per impostazione predefinita, sia C che Pascal inseriscono gli argomenti (e ottengono i valori restituiti) dallo stack, ma lo stanno facendo in un ordine diverso . Puoi anche scambiare argomenti tra le tue funzioni nei registri mediante alcune ottimizzazioni dipendenti dal compilatore.
Come vedi correttamente, l'abitudine di Windows è che costruendo una dll, creiamo anche un minimo .a
/ .lib
con esso. Questa libreria statica minima è solo un wrapper, i simboli (funzioni) di quella DLL sono raggiunti attraverso di essa. Ciò rende necessarie le conversioni di chiamata a livello di asm.
Il suo vantaggio è la compatibilità. Lo svantaggio è che se hai solo una DLL, puoi avere difficoltà a capire come si chiamano le sue funzioni. Questo rende l'utilizzo delle DLL un'attività di hacking, se lo sviluppatore della DLL non ti dà il.a
. Pertanto, serve principalmente a scopi di chiusura, ad esempio, quindi è più facile ottenere denaro extra per gli SDK.
Un altro svantaggio è che anche se si utilizza una libreria dinamica, è necessario compilare staticamente questo piccolo wrapper.
In Linux, l'interfaccia binaria delle dll è standard e segue la convenzione C. Pertanto, non .a
è necessario e esiste una compatibilità binaria tra le librerie condivise, in cambio non abbiamo i vantaggi dell'abitudine di microsoft.