Frage

Ich habe nie viele Gedanken in den Größenunterschied zwischen einer statischen Bibliothek setzen und einer dynamischen Bibliothek, bis ich heruntergeladen gebauten pre heute Bibliotheken von Boost. Ich fand, dass die statischen Bibliotheken von Boost sind viel viel größer als die dynamischen Bibliotheken.

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

Die zweite Frage, ob ich statisch gegen verknüpfen, sagen wir mal, die wave Bibliothek. Heißt die meine ausführbare Datei wird in der Größe mehr als 97.7 mb Ballon?

War es hilfreich?

Lösung

Die statischen Bibliotheken haben die vollständigen Debug-Symbolinformationen in ihnen. Für DLLs, dass die Informationen in PDB-Dateien sein würden (was ich davon ausgehen würde, in der Größe zu dem statischen Libs ähnlich sein).

Wenn Sie auf den statischen lib verknüpfen, wird die Symbolinformation nicht in die .exe kopiert werden - es wird in der PDB-Datei platziert werden (wenn Ihr Build konfiguriert ist, eine PDB-Datei zu erstellen). Die PDB-Datei muss nicht mit der EXE verteilt werden, ob die PDB erstellt wird.

In der Pre-built-Bibliothek herunterladen I von boostpro.com bekommen, ich habe nicht PDB-Dateien für die Boost-DLLs sie bieten. Wenn Sie die DLLs selbst bauen, werden Sie wahrscheinlich die PDB-Dateien erhalten (obwohl Sie müssen möglicherweise einige Konfigurationsoption bestimmt, für die ich keine Ahnung, was die Details sind).


Update:

Sieht aus wie ich falsch leicht könnte PDB-Dateien für den Boost-DLLs zu bekommen. Aus 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   hinzufügen <install-type>PDB überall dort, wo   <install-type>SHARED_LIB oder   <install-type>STATIC_LIB ist jetzt   geschrieben.

Andere Tipps

Nein, nur weil die LIB-Datei eine bestimmte Größe ist, bedeutet nicht, es, dass die Größe Ihrer EXE hinzufügen. In der Tat sind die meisten Linker intelligent genug, um Verbindung nur in dem Material, das verwendet wird. Vergleichen Sie das mit einer dynamischen Bibliothek, die alles enthalten muss.

Statische Bibliotheken auf jeden Fall Ihre EXE größer machen, aber ich es immer vorziehen. Dann habe ich keine Sorgen über fehlende oder inkompatible Bibliotheken zur Laufzeit. (Oder zumindest ich die Chancen dafür minimieren.)

Da statische Bibliotheken binäre Daten enthalten nicht fertig, sondern Informationen, die für Linker Build binär, können diese Informationen als gebaut Binärdateien größer sein.

Wenn irgendeine Funktion in Header-Datei definiert in CPP-Datei verwendet wird, Compiler setzt seinen Code (entweder inlines oder fügt einfach) zu Objektdatei führt. Dies bedeutet, dass es eine Menge von Duplikaten sein. Es ist Linker hat die Aufgabe, sie zu verschmelzen, so statische Bibliothek wartet nur für Linker reduziert werden:)

Generell Größe der ausführbaren Datei ist in der Regel größer, mit statischen Bibliotheken, aber der Größe der ausführbaren Datei zusammen mit dynamischen Bibliotheken ist in der Regel kleiner. DLL und EXE separat verbunden, so Linker kann nicht wissen, welche Funktionen in DLL benötigt wird, und die weggeschleudert werden können. Im Fall einer statischen Bibliothek hat Linker solche Informationen und kann nur die obj-Dateien nehmen, die verwendet werden.

Die Debug-statische Bibliothek enthält Debug-Informationen, die die enorme Größe Unterschied erklärt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top