2010-07-14 7 views
58

Cosa contiene un file .lib di libreria statica, libreria dinamica collegata in modo statico e libreria dinamica collegata dinamicamente?Cosa c'è all'interno del file .lib della libreria statica, della libreria dinamica collegata in modo statico e della libreria dinamica collegata dinamicamente?

Come mai non è necessario un file .lib nella libreria dinamica collegata dinamicamente e anche nel collegamento statico, il file .lib non è altro che un file .obj con tutti i metodi. È corretto?

+2

Si potrebbe notare che la domanda riguarda la piattaforma MS Windows. – cubuspl42

risposta

89

Per una libreria statica, il file .lib contiene tutto il codice e i dati per la libreria. Il linker identifica quindi i bit di cui ha bisogno e li inserisce nell'eseguibile finale.

Per una libreria dinamica, il file .lib contiene un elenco delle funzioni e degli elementi di dati esportati dalla libreria e informazioni su quale DLL provengono. Quando il linker crea l'eseguibile finale, se viene utilizzata una qualsiasi delle funzioni o degli elementi di dati dalla libreria, il linker aggiunge un riferimento alla DLL (causandone il caricamento automatico da parte di Windows) e aggiunge voci alla tabella di importazione dell'eseguibile in modo tale che una chiamata alla funzione viene reindirizzata in quella DLL.

Non è necessario un file .lib per utilizzare una libreria dinamica, ma senza uno non è possibile trattare le funzioni dalla DLL come normali funzioni nel codice. Invece è necessario chiamare manualmente LoadLibrary per caricare la DLL (e FreeLibrary al termine) e GetProcAddress per ottenere l'indirizzo della funzione o dell'elemento di dati nella DLL. È quindi necessario inoltrare l'indirizzo restituito a un puntatore-a-funzione appropriato per poterlo utilizzare.

+1

Dopo una lunga ricerca, IMO, ho ottenuto la risposta migliore per la ragione usando una lib & dll. Grazie – Jeet

6

In una libreria statica, il file lib contiene il codice oggetto effettivo per le funzioni fornite dalla libreria. Nella versione condivisa (quella che viene definita libreria dinamica collegata in modo statico), c'è abbastanza codice per stabilire il collegamento dinamico in fase di esecuzione.

Non sono sicuro di "librerie dinamiche collegate dinamicamente" (caricate a livello di codice). In questo caso, ti colleghi addirittura a .lib?

Edit:

un po 'tardi ad arrivare, ma no, non si collega una lib. Bene, si collega alla lib con libraryloaderex al suo interno. Ma per la biblioteca reale che si sta utilizzando, è necessario fornire i propri attacchi tramite puntatori a funzione C e LoadLibrary riempie quelle in

Ecco un riassunto:.

 
Linking ǁ Static  | DLL     | LoadLibrary 
=========ǁ===============|======================|=================== 
API code ǁ In your com- | In the DLL   | In the DLL 
lives ǁ piled program |      | 
---------ǁ---------------|----------------------|------------------- 
Function ǁ Direct, may | Indirect via table | Indirect via your 
calls ǁ be elided  | filled automatically | own function ptrs 
---------ǁ---------------|----------------------|------------------- 
Burden ǁ Compiler  | Compiler/OS   | You/OS 
+0

da librerie collegate staticamente, cioè utilizzando un file .lib e collegando il file .dll in fase di compilazione. Il collegamento dinamico collega il file .dll al runtime utilizzando la funzione libraryloaderex() dell'API Win32. – Sulla

1

In dll sono "cose" come in un exe (ci possono essere qualsiasi tipo di dati, importazioni, esportazioni, sezioni di lettura/scrittura/eseguibili) ma la differenza è che un file exe esporta solo il punto di ingresso (funzione) ma l'esportazione di una/molte funzioni di dll.

8

Ho trovato il seguente answer da Hans anche utile qui. Si chiarisce l'aria che ci potrebbero essere due tipi di file lib.

Un file LIB viene utilizzato per creare il programma, esiste solo sulla macchina di build e non viene spedito. Ci sono due tipi. Una libreria di collegamento statico è un pacchetto di file .obj, raccolti in un singolo file. Il linker seleziona qualsiasi porzione di codice dal file quando è necessario risolvere un identificatore esterno.

Ma più rilevante per le DLL, un file LIB può anche essere una libreria di importazione. È quindi un semplice file di piccole dimensioni che include il nome della DLL e un elenco di tutte le funzioni esportate dalla DLL. È necessario fornire al linker quando si crea un programma che utilizza la DLL in modo che sappia che un identificatore esterno è in realtà una funzione esportata dalla DLL . Il linker utilizza la libreria di importazione per aggiungere voci alla tabella di importazione per l'EXE. Che viene poi utilizzato da Windows al runtime per capire quali DLL devono essere caricati per eseguire il programma.

1

Un file lib viene letto dal linker e durante l'esecuzione viene utilizzato un file dll. Un file lib è essenzialmente inutile durante l'esecuzione e un linker non è in grado di leggere leggendo un file dll (tranne forse in un modo irrilevante qui).

Le differenze tra l'utilizzo di file lib per il collegamento statico e dinamico potrebbero creare confusione ma se si capisce un po 'di storia, allora diventa molto chiaro.

Originariamente c'erano solo le librerie statiche. Per una libreria statica, il file .lib contiene file obj. Ogni file obj è l'output di uno e un solo file di input del codice sorgente del compilatore. Un file lib è solo una raccolta di file obj correlati, proprio come mettere file obj in una directory. Questo è essenzialmente ciò che è un file lib, una libreria di file obj. Per un collegamento statico, tutti i file obj utilizzati da un eseguibile vengono riuniti in un unico file. Confrontalo con un collegamento dinamico in cui l'eseguibile si trova in un file separato dall'altro codice che usa.

Per implementare il collegamento dinamico, Microsoft ha modificato l'utilizzo dei file lib in modo tale che si riferiscano a un file dll anziché a posizioni in un file obj. Oltre a ciò, tutte le informazioni contenute in una libreria per un collegamento statico sono le stesse di un collegamento dinamico. Sono tutti uguali per quanto riguarda le informazioni in essi, tranne per il fatto che un file lib per un collegamento dinamico specifica il file dll.

Problemi correlati