Frage

Ich habe eine statische Bibliothek * .lib mit MSVC erstellt unter Windows. Die Größe der Bibliothek ist 70KB sagen. Dann habe ich eine Anwendung, die diese Bibliothek verknüpft. Aber jetzt ist die Größe der endgültigen ausführbaren Datei (* .exe) ist 29KB, kleiner als die Bibliothek. Was ich wissen möchte, ist:

  1. Da die Bibliothek statisch verknüpft ist, dachte ich es direkt an die Größe der ausführbaren Datei hinzufügen sollten und die endgültige exe Größe sollte mehr als das sein? Hat Windows EXE-Format auch eine gewisse Komprimierung der binären Daten tun?

  2. Wie es für Linux-Systeme ist, dass ist, wie Größen von Bibliothek auf Linux (* .a / *. La-Datei) mit einer Größe von Linux ausführbar beziehen (* .out)?

-AD

War es hilfreich?

Lösung

Es gibt zusätzliche Buchhaltungsinformationen in der .lib Datei, die nicht für die endgültige ausführbare Datei benötigt wird. Diese Information hilft der Linker den Code finden, um tatsächlich zu verknüpfen. Auch Debug-Informationen in der .lib-Datei gespeichert werden, aber nicht in der .exe-Datei (ich kann mich nicht erinnern, wo Debug-Informationen für objs in einer Lib-Datei gespeichert sind, es könnte irgendwo anders sein).

Andere Tipps

Eine statische Bibliothek auf Windows und Unix ist eine Sammlung von OBJ / .o-Dateien. Der Linker sieht an jedem dieser Objektdateien und stellt fest, ob es für das Programm zu verknüpfen benötigt wird. Wenn es nicht erforderlich ist, dann wird die Objektdatei nicht in der endgültigen ausführbaren Datei enthalten bekommen. Dies kann zu einem ausführbaren Dateien führen, die kleiner als die Bibliothek ist.

EDIT: Wie MSalters weist darauf hin, unter Windows den VC ++ Compiler unterstützt nun Objektdateien zu erzeugen, die Funktion Ebene Verknüpfung ermöglichen, zum Beispiel finden Sie unter hier . In der Tat, bearbeiten und fortsetzt erfordert dies, da die Bedürfnisse edit-und-weiterhin in der Lage sein, den kleinstmöglichen Teil der ausführbaren Datei zu ersetzen.

Die statische Bibliothek enthält wahrscheinlich einige Funktionen, die nie verwendet werden. Wenn der Linker die Bibliothek mit dem Hauptprogramm verknüpft, sieht es, dass bestimmte Funktionen nicht verwendet werden (und ihre Adressen sind in Funktionszeigern nie genommen und gespeichert werden), es wirft nur den Code entfernt. Es kann dies auch rekursiv tun: wenn die Funktion A () nie aufgerufen wird, und A () ruft B (), aber B () wird nie anders genannt, kann er den Code für beide A () und B () entfernen. Unter Linux geschieht das gleiche.

Hinweis . Es ist schon eine lange Zeit, da ich mit statischen Linken behandelt, so nehmen Sie meine Antwort mit einem Körnchen Salz

Sie schrieb: Ich dachte, es direkt sollte mehr als das sein, um die Größe der ausführbaren Datei und endgültigen exe Größe sollte hinzufügen

?

Naive Linker funktionieren genau auf diese Weise - zurück, als ich für CP / M Systeme Hobby Entwicklung zu tun (vor langer Zeit), war dies ein echtes Problem.

Moderne Linker sind schlauer, aber - sie nur in den Funktionen, die von dem ursprünglichen Code verwiesen verknüpfen, oder je nach Bedarf

.

Zusätzlich zu den aktuellen Antworten wird der Linker erlauben Funktionsdefinitionen zu entfernen, wenn sie identischen Objektcode haben -. Dies soll die Blähungen Auswirkungen von Templat-Code zu reduzieren

Eine statische Bibliothek enthalten muss alle Symbol in seinen Quellcode definiert, weil es könnte in eine ausführbare Datei verlinkt wird, die nur das spezifische Symbol muss. Aber sobald es in eine ausführbare Datei verknüpft ist, wissen wir genau, welche Symbole am Ende verwendet wird, und welche nicht. So kann der Linker trivialerweise nicht verwendeten Code entfernen, um die Dateigröße von viel trimmen. In ähnlicher Weise alle doppelten Symbole (etwas, das sowohl in der statischen Bibliothek definiert ist und die ausführbare Datei es verknüpft ist in in eine einzige Instanz verschmolzen wird.

@All: Danke für die Hinweise. @ Greg Hewgill - Ihre Antwort war ein guter Zeiger. Danke.

Die Antwort fand ich heraus, war wie folgt:

1.) Während Bibliotheksgebäude, was passiert ist, wenn die Option „Keep-Programm Debug databse“ in MSVC (oder so ähnlich) eingeschaltet ist, dann Bibliothek wird diese Debug-Informationen hat seine Größe Blähungen.  aber wenn ich statisch diese Bibliothek enthalten und eine ausführbare Datei erstellen, die Linker-Streifen alle, die Debug-Informationen aus der Bibliothek, bevor Sie die exe geenrating und damit die exe Größe geringer ist als die der Bibliothek.

2.) Wenn ich die Option deaktiviert „Keep-Programm Debug databse“, bekam ich eine Bibliothek, deren Größe kleiner als die endgültige ausführbare Datei, die war, was ich dachte, in den meisten Situationen nromal ist.

-AD

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