Domanda

Non ho mai messo molto pensiero nella differenza di dimensioni tra una libreria statica e una libreria dinamica fino a quando ho scaricato librerie di spinta pre-costruiti oggi. Ho trovato che le librerie statiche di spinta sono molto molto più grande rispetto alle librerie dinamiche.

Per esempio, la libreria onda statica di debug multi-threaded boost è 97.7 mb in termini di dimensioni, mentre la stessa libreria, ma dinamica, è solo 1.4 mb in termini di dimensioni (tra cui libreria di importazione e dll)! Questa è una differenza enorme. Perché?

Seconda domanda, se collego staticamente contro, diciamo, la biblioteca wave. Vuol dire che il mio eseguibile sarà palloncino per dimensioni a più di 97.7 mb?

È stato utile?

Soluzione

Le librerie statiche hanno la piena informazioni sui simboli di debug in loro. Per le DLL che l'informazione sarebbe in file PDB (che presumo sarebbe di dimensioni simili alle librerie statiche).

Quando si collega al lib statica, le informazioni sui simboli non verrà copiato nella .exe - sarà inserito nel file PDB (se la vostra generazione è configurato in modo da creare un file PDB). Il file PDB non ha bisogno di essere distribuito con l'exe, anche se non si crea il PDB.

Nel pre-built scaricare library che ricevo da boostpro.com, non ottengo PDB file per le DLL Boost che forniscono. se si costruisce le DLL da soli, probabilmente ottenere i file PDB (anche se si potrebbe essere necessario impostare qualche opzione di configurazione, per la quale non ho idea di quello che i dettagli sono).


Aggiornamento:

appare come potrei essere sbagliato facilmente diventando file PDB per le DLL boost. Da http://comments.gmane.org/gmane.comp.lib. boost.build/23246 :

> Is there an additional option that I can pass on the command line to
> have the (correctly generated) PDB files also copied into the stage
> directory?
     

Non in questo momento. Si può incidere solo   tools/build/v2/tools/package.jam a   aggiungere <install-type>PDB ovunque dove   <install-type>SHARED_LIB o   <install-type>STATIC_LIB è ora   scritta.

Altri suggerimenti

No, solo perché il file LIB è una certa dimensione, non significa che sarà aggiungere che il formato al vostro EXE. In realtà, la maggior parte dei linker sono abbastanza intelligenti per collegamento nel solo ciò che viene utilizzato. Confronti che, per una libreria dinamica, che deve contenere tutto.

Le librerie statiche sicuramente rendere il vostro EXE più grande, ma ho sempre preferiscono. Allora io non devo preoccuparmi di librerie incompatibili in fase di esecuzione o mancanti. (O almeno, io minimizzare le possibilità di questo.)

Dal momento che le librerie statiche non contengono dati binari finiti, ma piuttosto le informazioni necessarie per linker per costruire binario, queste informazioni possono essere più grande di binari compilati.

Quando una funzione definita nel file di intestazione viene utilizzato in cpp file, compilatore mette il suo codice (sia inlines, o semplicemente aggiunge) per conseguente file oggetto. Questo significa che ci saranno un sacco di duplicati. Il lavoro di E 'linker per unirle, libreria in modo statico aspetta solo per linker a ridurre:)

In generale dimensioni del file eseguibile è solitamente più grande con le librerie statiche, ma la dimensione di insieme eseguibile con le librerie dinamiche è di solito più piccoli. DLL e EXE sono collegati separatamente, in modo linker non può sapere che la funzionalità è necessario in DLL e che può essere buttato fuori. In caso di libreria statica, il linker ha tali informazioni e può assumere solo i obj-files che vengono utilizzati.

La libreria di debug statica contiene le informazioni di debug, il che spiega l'enorme differenza di dimensioni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top