6

Ich habe nie viel über den Größenunterschied zwischen einer statischen Bibliothek und einer dynamischen Bibliothek nachgedacht, bis ich die vorgefertigten Bibliotheken von Boost heruntergeladen habe. Ich fand, dass die statischen Boost-Bibliotheken viel größer sind als die dynamischen Bibliotheken.Größenunterschied zwischen statischer und dynamischer (debug) Bibliothek und Auswirkung auf die endgültige exe

Zum Beispiel kann die Debug-Multi-Threaded-Boost-Welle statische Bibliothek ist 97.7 mb in Größe, während die gleiche Bibliothek, aber dynamisch, nur ist 1.4 mb in der Größe (einschließlich Import-Bibliothek und dll)! Das ist ein großer Unterschied. Warum ist das?

Zweite Frage, wenn ich statisch gegen, sagen wir, die wave Bibliothek. Bedeutet das, dass sich meine ausführbare Datei auf mehr als 97.7 mb vergrößert?

Antwort

4

Die statischen Bibliotheken enthalten die vollständigen Debugsymbolinformationen. Für DLLs wäre diese Information in .pdb-Dateien (von denen ich annehme, dass sie in der Größe den statischen libs ähnlich wären).

Wenn Sie eine Verknüpfung zur statischen Bibliothek herstellen, werden die Symbolinformationen nicht in die EXE-Datei kopiert. Sie wird in der PDB-Datei gespeichert (wenn Ihre Erstellung zum Erstellen einer PDB-Datei konfiguriert ist). Die PDB-Datei muss nicht mit der EXE-Datei verteilt werden, unabhängig davon, ob die PDB erstellt wird oder nicht.

Im vorgefertigten Bibliotheksdownload, den ich von boostpro.com bekomme, bekomme ich keine .pdb-Dateien für die Boost-DLLs, die sie bereitstellen. Wenn Sie die DLLs selbst erstellen, erhalten Sie wahrscheinlich die .pdb-Dateien (obwohl Sie möglicherweise einige Konfigurationsoptionen festlegen müssen, für die ich keine Ahnung habe, was die Details sind).


Update:

Sieht aus wie ich falsch sein könnte über leicht Dateien für den Boost-DLLs immer PDB.Von 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? 

zu diesem Zeitpunkt nicht. Sie können nur hacken tools/build/v2/tools/package.jam zu <install-type>PDB überall hinzufügen, wo <install-type>SHARED_LIB oder <install-type>STATIC_LIB jetzt ist geschrieben.

+2

Das ist sehr interessant ... kompilieren sie Release statische Bibliotheken mit Debug-Informationen? Das wird nicht ganze Programmoptimierung und somit langsameren Code erlauben (oder irre ich mich hier)? – Samaursa

+0

.pdb-Dateien nehmen Windows/Visual Studio an, das in der Frage nicht erwähnt wird (aber möglicherweise gültig ist). –

+0

@Tony: Du hast recht - ich hätte sagen sollen, "Auf meinem Setup ..." –

3

Nein, nur weil die LIB-Datei eine bestimmte Größe hat, heißt das nicht, dass diese Größe zu Ihrer EXE hinzugefügt wird. In der Tat sind die meisten Linker schlau genug, um nur das Zeug, das verwendet wird, zu verknüpfen. Vergleichen Sie das mit einer dynamischen Bibliothek, die alles enthalten muss.

Statische Bibliotheken machen Ihre EXE definitiv größer, aber ich bevorzuge sie immer. Dann muss ich mir zur Laufzeit keine Gedanken über fehlende oder inkompatible Bibliotheken machen. (Oder zumindest minimiere ich die Wahrscheinlichkeit dafür.)

0

Die statische Debugbibliothek enthält Debuginformationen, die den enormen Größenunterschied erklären.

1

Da statische Bibliotheken keine fertigen binären Daten enthalten, sondern Informationen, die für den Linker zum Erstellen von Binärdateien benötigt werden, können diese Informationen größer sein als die erstellten Binärdateien.

Wenn eine in der Header-Datei definierte Funktion in der cpp-Datei verwendet wird, fügt der Compiler seinen Code (entweder Inline oder einfach hinzugefügt) in die resultierende Objektdatei ein. Dies bedeutet, dass es viele Duplikate geben wird. Die statische Bibliothek wartet nur darauf, dass der Linker reduziert wird.

Im Allgemeinen ist die Größe der ausführbaren Datei normalerweise größer bei statischen Bibliotheken, aber die Größe der ausführbaren Datei zusammen mit dynamischen Bibliotheken ist normalerweise kleiner. DLL und EXE sind separat verknüpft, daher kann Linker nicht wissen, welche Funktionalität in DLL benötigt wird und welche ausgeschlossen werden kann. Im Fall einer statischen Bibliothek hat der Linker solche Informationen und kann nur diejenigen Obj-Dateien verwenden, die verwendet werden.