Frage

Wahrscheinlich ist dies eine häufig gestellte Frage. In der Tat glaube ich, dass ich es Jahre fragte vor ... aber ich kann die Antwort nicht erinnern.

Das Problem ist: Ich habe ein Projekt, das von 6 Quelldateien zusammengesetzt ist. Alle von ihnen nicht mehr als 200 Zeilen Code. Es verwendet viele STL-Container, stdlib.h und Iostream. Nun ist die ausführbare Datei um 800kb groß ist .... Ich denke, ich sollte nicht statisch Bibliotheken verknüpfen. Wie mit GCC dies zu tun? Und in Eclipse CDT?

EDIT: Wie ich Antworten weg von dem, was ich will ich denke, es ist der Fall für eine Klarstellung ist. Was ich wissen möchte, ist, warum ein so kleines Programm so groß in der Größe ist und was die Beziehung zu statisch, gemeinsam genutzte Bibliotheken und ihre Differenz. Wenn es sich um eine zu lange Geschichte ist zu sagen, fühlen Sie sich frei Zeiger auf Dokumente zu geben. Danke

War es hilfreich?

Lösung

Wenn Sie geben g ++ dynamische Bibliothek Namen, und geben sie nicht die -static Flagge, sollte es dynamisch verknüpfen.

Größe zu reduzieren, Sie könnten natürlich die binäre strip, und übergeben Sie die -Os (Optimierung für Größe) Optimierung Flag g++.

Andere Tipps

Eine Sache zu erinnern ist, dass mit Hilfe der STL Ergebnisse in mit, dass zusätzlicher Code in der ausführbaren Datei , auch wenn Sie dynamisch mit der C ++ Bibliothek verknüpfen. Dies ist aufgrund der Tatsache, dass die STL ist ein Bündel von Vorlagen , die nicht tatsächlich kompiliert werden, bis Sie Ihren Code zu schreiben und kompilieren. Da die Bibliothek nicht antizipieren, was man in einem Behälter gespeichert werden könnte, gibt es keine Möglichkeit für die Bibliothek bereits den Code für diese bestimmte Verwendung des Behälters enthält. Das gleiche gilt für Algorithmen und alles andere in der STL.

Ich sage nicht, dies auf jeden Fall der Grund ist die ausführbare Datei ist so viel größer als man erwarten würde. Aber es kann ein Faktor sein.

Eclipse-sollte dynamisch standardmäßig wird die Verknüpfung, wenn Sie die statische Flagge auf dem Linker in Ihrer Make-Datei festgelegt haben.

Als Antwort auf Ihre EDIT:

-Wenn Sie statisch verknüpfen, enthält die ausführbare Datei eine vollständige Kopie jeder Bibliothek, die Sie verknüpft haben.
-Wenn Sie dynamisch verknüpfen, nur die ausführbare Datei enthält Verweise und Haken an den verknüpften Bibliotheken, die eine viel viel kleinere Menge an Code ist.

Die ausführbare Datei hat mehr als nur Ihren Code enthält.

Am allerwenigsten, es enthält einige Startup-Code, das Einrichten der Umgebung und, falls erforderlich, alle externen Bibliotheken laden, bevor das Programm startet.

Wenn Sie statisch die Laufzeitbibliothek verknüpft haben, erhalten Sie auch, dass in die ausführbare Datei enthalten. Ansonsten wird nur Sie einen kleinen Stummel bekommen, gerade groß genug, um Systemaufrufe an die externen Laufzeit umgeleitet werden.

Es kann je nach Compiler-Einstellungen umfassen auch eine Menge Debugging-Informationen und andere nicht wesentliche Daten. Wenn Optimierungen aktiviert sind, Code-Größe, dass möglicherweise auch erhöht.

Die eigentliche Frage ist Warum ist das wichtig ? 800KB passt immer noch leicht auf einer Diskette! Das meiste ist eine einmalige Kosten. es bedeutet nicht, dass, wenn Sie doppelt so viel Code zu schreiben, wird es 1600KB nehmen. Wahrscheinlicher ist, wird es 810KB oder so etwas zu nehmen.

Sie über einmalige Anlaufkosten keine Sorgen machen.

Mit O3 und es Flaggen der optimierten binären herzustellen. Siehe auch diese Link für einige weitere Informationen rel="nofollow.

Wenn Sie für Windows bauen, sollten Sie den Microsoft-Compiler. Es erzeugt immer die kleinste binäre auf dieser Plattform.

Die Größe führt in der Regel statische Bibliotheken in Ihre Anwendung verknüpft werden.

Sie können die Größe der kompilierten binären reduzieren durch Kompilieren Versionen zu veröffentlichen, mit Optimierungen auf binäre Größe.

Eine weitere Quelle der Größe der ausführbaren Datei sind die Bibliotheken. Sie sagten, dass Sie keine externen Bibliotheken nicht verwenden, außer für STD, so dass ich glaube, Sie sind mit der C Runtime mit ausführbaren Datei, dh die Verknüpfung statisch. so überprüfen Sie für eine dynamische Verbindung.

IMO sollte man nicht wirklich Sorgen zu machen, aber wenn Sie wirklich paranoid sind, lesen Sie in diesem kleinste x86-ELF Hallo Welt

verwenden Visual C ++ 6.0 es unterstützt mit Windows 95 bis Windows 7. und kann als x86-Plattformen kompiliert werden, sondern nur für Windows. also, wenn Sie ein Windows-Benutzer sind nur Stick mit Windows-Compiler andere als GCC, die sux actually.most von Menschen, die sagen, Visual C ++ ist sux weil sie Anti-Microsofters sind. auch nicht vergessen, „Visual C ++ 6.0“ verwenden, wenn Sie eine neuere Version verwenden, können Sie wahrscheinlich nicht ausführen, um Ihre Dateien auf Windows 95. Ich habe all diese Dinge getestet, warum, sagte ich. GCC produziert größte Binärdateien, aber Visual C ++ nicht, kann Intel Compiler verwenden mehr als 30% der Platz zu sparen, aber es erfordert einen Intel-Prozessor, es sei denn Leistung schrecklich wäre. eine andere Sache, u müssen sich daran zu erinnern ist, wenn u Vorlagen verwenden, wenn Sie kleine Linien sehen Wenn Sie diese Funktionen kompiliert erweitert werden würde, so ist das Ergebnis größer Binärdateien machen. wenn Sie kleinere Binärdateien benötigen schlage ich vor Umzug in C Ursache C tatsächlich ist weit verbreitet, aber nicht OO infact C ist einfach als C ++ dies ist sinn dann C ++ Beispiel machen

cout << "Hallo Welt" << endl; printf ( "% s", "Hallo Welt");

zweite sagen Druckfeld% s bedeutet, dass Sie eine Zeichenfolge eingeben, so dass es einfach ist. : P

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