visual studio 8 vs. gcc (warum unterscheidet sich die größe der exe)
-
egal wie ich codeblock oder devcpp bzw. unter linux einstelle, die dateien sind alle größer als 400kb(und das bei einem konsolenprog!). der visual compiler erzeugt dateien, die nur 7-50 kb groß sind. was mach ich verkehrt?
-
kann man in linux die c++ standardbibliothek dynamisch linken?
-
Das dürfte bei den meisten Klassen und Funktionen kaum möglich sein, da es Templates sind. Ich denke mal, dass man mit Compiler-Schalter da noch was rausholen kann, bin aber nicht übermäßig bewandelt mit dem g++.
-
Hast du mal ein einfaches Beispiel, das zu groß wird?
-
Hallo,
ich programmiere nicht unter Linux aber unter MacOS. (Auch GCC)
Und da wurden meine Binaries auch > 400kb, sobald ich iostreams oder strings verwendete.(Selbst hello,world)
Auch mit allen no-debug und dynamischen libs Einstellungen.
Es gab zwar eine Option "zero link", die aber für die Weiterverteilung auf andere Rechner nicht verwendet werden dürfe.Die Lösung war, von GCC-3.3 auf GCC-4.0 umzusteigen.
Nun wurden nur die Codeteile gelinkt, die auch verwendet wurden.
Ein Hello,World ist jetzt wieder ~20kb.
-
SeppSchrot schrieb:
Hallo,
ich programmiere nicht unter Linux aber unter MacOS. (Auch GCC)
Und da wurden meine Binaries auch > 400kb, sobald ich iostreams oder strings verwendete.(Selbst hello,world)Die Lösung war, von GCC-3.3 auf GCC-4.0 umzusteigen.
Nun wurden nur die Codeteile gelinkt, die auch verwendet wurden.
Ein Hello,World ist jetzt wieder ~20kb.Ein Hello, World ist bei mir beim gcc 3.3.5 ohne jegliche Option 8KiB und nach strip 4KiB. Kann aber gut sein, dass er auf Linux anders arbeitet als auf Mac. Vier KiB sind aber auch schon viel. Da ist jedoch viel overhead drin, der unabhängig vom Programm ist.
-
Optimizer schrieb:
Das dürfte bei den meisten Klassen und Funktionen kaum möglich sein, da es Templates sind. Ich denke mal, dass man mit Compiler-Schalter da noch was rausholen kann, bin aber nicht übermäßig bewandelt mit dem g++.
unter visual c++ bringt das jedenfalls sehr viel. es liegt wahrscheinlich an der iostream library und nicht an den templates.
-
Ich glaube, du verwechselst da was. Wo soll man die C++ Standardbibliothek dynamisch linken können?
-
ich meine unter Codeerstellung/Laufzeitbibliothek, Multithreaded-DLL (/MD) einstellen
-
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/core.2f.MD.2c_2f.ML.2c_2f.MT.2c_2f.LD.asp schrieb:
These options select either single-threaded or multithreaded run-time routines, indicate if a multithreaded module is a DLL, and select retail or debug versions of the run-time library.
Dürfte also nicht das sein, was du meinst. Es ist auch aus technischen Gründen eigentlich schwer möglich, Template-Klassen und -Funktionen in DLLs auszulagern, weil man ja nicht im vornherein weiß, mit welchen Template-Parametern etwas instanziert wird. Man könnte bestenfalls noch die Instanzen dieser Templates, die man für sein Programm benutzt, auslagern, aber damit wäre dann nicht wirklich was gewonnen.
-
Ich habe übrigens auch ohne die Standardeinstellungen zu verändern, beim VC++ ein 6KB Hello-World.
-
strip my_program.exe
Entfernt die Symboltabelle aus dem Programm und macht es deutlich kleiner. Debuggen wird damit allerdings schwierig...
-
Optimizer schrieb:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/core.2f.MD.2c_2f.ML.2c_2f.MT.2c_2f.LD.asp schrieb:
These options select either single-threaded or multithreaded run-time routines, indicate if a multithreaded module is a DLL, and select retail or debug versions of the run-time library.
Dürfte also nicht das sein, was du meinst. Es ist auch aus technischen Gründen eigentlich schwer möglich, Template-Klassen und -Funktionen in DLLs auszulagern, weil man ja nicht im vornherein weiß, mit welchen Template-Parametern etwas instanziert wird. Man könnte bestenfalls noch die Instanzen dieser Templates, die man für sein Programm benutzt, auslagern, aber damit wäre dann nicht wirklich was gewonnen.
ist mir klar, aber es gibt ja auch noch was anderes ausser templates. das hello-world programm wird bei mir 68 kb groß, und mit dynamischer Laufzeitbibliothek 4 kb.
(Visual C++ 7.1)
-
Beim GCC die Optionen -Os -s benutzen und die Binaries werden auf größe Optimiert.
-
kingruedi schrieb:
Beim GCC die Optionen -Os -s benutzen und die Binaries werden auf größe Optimiert.
Hatte das bei dir mal was gebracht, außer extrem langsamere Binaries.
-
dynamic linker schrieb:
ist mir klar, aber es gibt ja auch noch was anderes ausser templates. das hello-world programm wird bei mir 68 kb groß, und mit dynamischer Laufzeitbibliothek 4 kb.
(Visual C++ 7.1)
Was auch immer die "Laufzeitbibliothek" ist. Da können auch ne Menge betriebssystemspezifischer Sachen drin stecken. Die Standardbibliothek von C++ besteht zu sehr großen Teilen aus Templates und ich kann dir mal garantieren, dass sie nicht allgemein für mehrere Applikationen ausgelagert werden können. Du kannst natürlich die Instanzen speziell für dein Programm auslagern, hast aber nichts davon, weil du dann die DLL mitliefern musst.
Wenn du weißt, wie man kleine Binaries erzeugt, halte ich dich nicht auf. Ich mach nichts und habe auch kleine.
(VC++ 8, wo ich deine Optionen übrigens gar nicht gefunden habe)
-
ccux schrieb:
egal wie ich codeblock oder devcpp bzw. unter linux einstelle, die dateien sind alle größer als 400kb(und das bei einem konsolenprog!). der visual compiler erzeugt dateien, die nur 7-50 kb groß sind. was mach ich verkehrt?
der mingw hat eine zeitlang mal die iostream-lib grundsätzlich statisch gelinkt - ich weiß bloß nicht mehr warum.
mfg
-
ein programm mit iostream, string, map ist bei mir 22k. da ist auch noch socket, etc drin.
liegt also nicht an gcc.
-
Besser wäre es mal, wenn ihr die Compiler-Optionen nennt...
-
auf größe optimieren bringt nur ca 10kb, bleiben noch 400. und das bei helloworld, oder 3 klassen-progs? da scheint mir der vc wesentlich besser!