File DLL e LIB: cosa e perché?


214

So ben poco di DLL e LIB oltre a quello che contengono il codice vitale necessario per il corretto funzionamento di un programma: le librerie. Ma perché i compilatori li generano affatto? Non sarebbe più semplice includere tutto il codice in un singolo eseguibile? E qual è la differenza tra DLL e LIB?


Risposte:


299

Esistono librerie statiche (LIB) e librerie dinamiche (DLL), ma si noti che i file .LIB possono essere librerie statiche (contenenti file oggetto) o librerie di importazione (contenenti simboli per consentire al linker di collegarsi a una DLL).

Le librerie vengono utilizzate perché potresti avere del codice che desideri utilizzare in molti programmi. Ad esempio, se si scrive una funzione che conta il numero di caratteri in una stringa, tale funzione sarà utile in molti programmi. Una volta che la funzione funziona correttamente, non devi ricompilare il codice ogni volta che la usi, quindi inserisci il codice eseguibile per quella funzione in una libreria e il linker può estrarre e inserire il codice compilato nel tuo programma . Le biblioteche statiche sono talvolta chiamate "archivi" per questo motivo.

Le librerie dinamiche fanno un ulteriore passo avanti. Sembra inutile avere più copie delle funzioni della libreria che occupano spazio in ciascuno dei programmi. Perché non possono tutti condividere una copia della funzione? Ecco a cosa servono le librerie dinamiche. Invece di creare il codice della libreria nel programma quando viene compilato, può essere eseguito mappandolo nel programma mentre viene caricato in memoria. Più programmi in esecuzione contemporaneamente che utilizzano le stesse funzioni possono tutti condividere una copia, risparmiando memoria. In effetti, puoi caricare le librerie dinamiche solo quando necessario, a seconda del percorso attraverso il tuo codice. Inutile che le routine di stampa occupino memoria se non si esegue alcuna stampa. D'altra parte, ciò significa che devi avere una copia della libreria dinamica installata su ogni macchina su cui è in esecuzione il programma.

Ad esempio, quasi tutti i programmi scritti in 'C' avranno bisogno di funzioni da una libreria chiamata 'libreria di runtime C, anche se pochi programmi avranno bisogno di tutte le funzioni. Il runtime C è disponibile sia in versione statica che dinamica, in modo da poter determinare quale versione utilizza il programma in base a esigenze particolari.


81
Si scopre che i .LIBfile possono essere librerie statiche (contenenti file oggetto) o librerie di importazione (contenenti simboli per consentire al linker di collegarsi a una DLL). Mi chiedo perché sia ​​così.
Lumi,

2
buona spiegazione! Il codice è condiviso e i dati (per impostazione predefinita) non sono condivisi tra le applicazioni che consumano una DLL.
mox,

4
@Lumi: buon punto. In termini di DLL abbiamo due tipi di collegamento. Collegamento implicito , quando abbiamo un .libfile fornito dal creatore della DLL insieme alle intestazioni appropriate; questo .libè semplicemente un descrittore della DLL di destinazione, contiene indirizzi, punto di ingresso, ecc. ma nessun codice. Questo .libdeve essere passato al linker. Il secondo è il collegamento esplicito quando usiamo la DLL caricandola manualmente con la LoadLibraryfunzione. In questo tipo non abbiamo bisogno di quel .libfile, ma dobbiamo fare un piccolo sforzo per trovare le esportazioni DLL, i loro indirizzi e chiamare queste funzioni tramite puntatori.
Itachi,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.