2010-07-26 9 views
7

Ho una libreria statica compilata C++ di circa 15 classi e le loro funzioni membro e roba, e compilata, è quasi 14 megabyte. Si collega alla densa libreria di hash della tabella di Google e MPIR, che è come GMP per Windows, ma l'ho fatto in un exe normale ed erano pochi kilobyte. Perché è così massiccio? Cosa posso fare per ridurne le dimensioni? Sembra che ci siano altri programmi molto più complicati dei miei che sono molto più piccoli.Perché la mia libreria statica è così grande?

compilato con Visual C++, linea di comando è:

/Zi /nologo /W3 /WX- /O2 /Oi /Oy- /GL /D "WIN32" /D "NDEBUG" /D "_CONSOLE" 
/D "_UNICODE" /D "UNICODE" /Gm- /EHsc /GS /Gy /fp:precise /Zc:wchar_t 
/Zc:forScope /Fp"Release\ang.pch" /Fa"Release\" /Fo"Release\" 
/Fd"Release\vc100.pdb" /Gd /analyze- /errorReport:queue 
+0

Puoi fornire alcune informazioni più specifiche? Compilatore, flag di compilazione, ecc. – Dusty

+0

Compilato con Visual C++, la riga di comando è: /Zi/nologo/W3/WX-/O2/Oi/Oy-/GL/D "WIN32"/D "NDEBUG"/D "_CONSOLE "/ D" _UNICODE "/ D" UNICODE "/ Gm-/EHsc/GS/Gy/fp: preciso/Zc: wchar_t/Zc: forScope /Fp"Release\ang.pch"/Fa "Release \"/Fo " Rilasciare "/Fd"Release\vc100.pdb"/Gd/analyze-/errorReport: queue – Foglio

+0

Riga di comando *, non flag. – Foglio

risposta

16

La libreria statica è un formato notevolmente diverso binario finito; parzialmente perché ha un po 'più di informazioni. In sostanza, la libreria statica agisce come un ZIP di tutti i file .obj generati dalle unità di traduzione. Ciò consente al linker di eliminare le funzioni inutilizzate e, se si utilizza LTCG, consente all'Inliner di prendere decisioni tra moduli e altre ottimizzazioni.

Inoltre, alcune modalità di compilazione incorporeranno i simboli di debug direttamente in .lib, eliminando la necessità di file .pdb separati.

Generalmente non è necessario preoccuparsi delle dimensioni della libreria statica; il linker cancellerà tutte le informazioni extra quando costruirà l'eseguibile finale.

+0

Il linker genera anche codice ridondante e morto, ecc. – greyfade

+0

@greyfade: In realtà il compilatore lo fa;) –

+0

@Billy ONeal: A * tempo di collegamento *? – greyfade