2009-05-27 20 views
153

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

risposta

220

Esistono librerie statiche (LIB) e librerie dinamiche (DLL).

Le librerie sono utilizzate perché potresti avere il 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 si desidera dover ricompilare il codice ogni volta che lo si utilizza, quindi si mette il codice eseguibile per quella funzione in una libreria e il linker può estrarre e inserire il codice compilato nel programma. . Le librerie statiche sono a volte chiamate "archivi" per questo motivo.

Le librerie dinamiche fanno un ulteriore passo avanti. Sembra uno spreco avere più copie delle funzioni della libreria occupando spazio in ciascuno dei programmi. Perché non possono condividere tutti una copia della funzione? Questo è ciò che le librerie dinamiche sono per. Invece di costruire il codice della libreria nel tuo programma quando è compilato, può essere eseguito mappandolo nel tuo 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 se necessario, a seconda del percorso attraverso il tuo codice. Non ha senso che le routine della stampante occupino memoria se non si sta facendo alcuna stampa. D'altra parte, questo significa che devi avere una copia della libreria dinamica installata su ogni macchina su cui gira il tuo programma. Questo crea la sua serie di problemi.

Ad esempio, quasi tutti i programmi scritti in "C" necessiteranno di funzioni da una libreria denominata "libreria runtime C", sebbene alcuni programmi necessitino di tutte le funzioni. Il runtime C è disponibile in entrambe le versioni statiche e dinamiche, quindi è possibile determinare quale versione il programma utilizza a seconda delle esigenze particolari.

+49

Si scopre 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). [Mi chiedo perché sia ​​così.] (Http://stackoverflow.com/q/6421693/269126) – Lumi

+1

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

10

Un motivo importante per la creazione di una DLL/LIB piuttosto che la semplice compilazione del codice in un file eseguibile è il riutilizzo e la ricollocazione. L'applicazione media Java o .NET (ad esempio) molto probabilmente utilizzerà diverse librerie di terze parti (o framework). È molto più facile e veloce compilare semplicemente una libreria pre-costruita, piuttosto che dover compilare tutto il codice di terze parti nella tua applicazione. Anche la compilazione del codice nelle librerie incoraggia le buone pratiche di progettazione, ad es. progettando le tue classi da utilizzare in diversi tipi di applicazioni.

24

Un altro aspetto è la sicurezza (offuscamento). Una volta che una parte di codice viene estratta dall'applicazione principale e inserita in una libreria "separata" di collegamento dinamico, è più facile attaccare, analizzare (decodificare) il codice, poiché è stato isolato. Quando la stessa porzione di codice è conservata in una libreria LIB, fa parte dell'applicazione di destinazione (collegata) compilata, e quindi è più difficile isolare (differenziare) quella parte di codice dal resto dei binari di destinazione.

+0

L'aspetto della sicurezza era nuovo per me. Il ragionamento sopra riportato è valido nel caso di un'app C# che chiama una dll C++ non gestita? – Martin

+0

Ma anche la LIB è isolata, non è vero? Quindi un attaccante potrebbe semplicemente analizzare la LIB. O è uno scenario comune che la LIB non è accessibile al pubblico? –

+3

anche la LIB è "isolata", per quanto riguarda il processo del compilatore, ma una volta che il linker mette insieme le parti, la LIB fa parte dell'EXE e non può essere differenziata dal proprio codice. – mox

7

Una DLL è una libreria di funzioni condivise tra altri programmi eseguibili. Basta guardare nella directory windows/system32 e ne troverai a decine. Quando il programma crea una DLL, normalmente crea anche un file lib in modo che il programma * .exe dell'applicazione possa risolvere i simboli dichiarati nella DLL.

A .lib è una libreria di funzioni collegate in modo statico a un programma - NON sono condivise da altri programmi. Ogni programma che si collega con un file * .lib ha tutto il codice in quel file. Se si hanno due programmi A.exe e B.exe che si collegano a C.lib, ogni A e B contengono entrambi il codice in C.lib.

Come si creano DLL e librerie dipendono dal compilatore che si utilizza. Ogni compilatore lo fa diversamente.

2

Un'altra differenza sta nella prestazione.

Come la DLL viene caricata in fase di esecuzione da .exe (s), il .exe (s) e la DLL funzionano con il concetto di memoria condivisa e, quindi, le prestazioni sono relativamente basse rispetto al collegamento statico.

D'altra parte, un .lib è un codice che è collegato staticamente al momento della compilazione in ogni processo che richiede. Quindi .exe (s) avrà una memoria singola, aumentando così le prestazioni del processo.

Problemi correlati