Dateigröße (exe)



  • Hallo,

    ich fange gerade an mich mit c++-Programmierung zu beschäftigen.

    Was mir dabei aufgefallen ist: Meine kompilierten Dateien sind >454kb groß (selbst "Hallo Welt"). Da es aber auch wesentlich kleinere .exe-Dateien gibt (selbst mit GUI) und ich nicht davon ausgehe, dass jeweils ASM dahintersteckt, wollte ich gerne wissen woran das liegen könnte. (Als Compiler benutze ich MinGW)

    Hoffe ihr könnt mir weiterhelfen.

    mfg
    Pseiko



  • Die Frage wird regelmäßig gestellt. Es hat mehrere Gründe:

    1. Du hast vielleicht einen zu alten Compiler der generell zu großen Code erzeugt.
    2. Du hast deine exe als Debug-Variante kompiliert -> Debug-Infos blähen die exe auf. Also als Release-Variante kompilieren.
    3. Du hast Templates benutzt (z.B. iostream-Libs), die sich naturgemäß nicht dynmisch linken lassen und somit immer in der exe drin sind. Was aber nicht heißt das es schlecht ist, es ist designbedingt, was auch seine indirekten Gründe (Vorteile) hat.

    Wenn ein Programm eine GUI hat, kommt es darauf an welche GUI-Lib sie benutzt? Ist es die Windows-GUI (Win32-API), dann ist diese logischerweise schon in Windows drin und muß nicht mit verlinkt werden. Es gibt aber auch GUI-Libs die designbedingt in die exe verlinkt werden, dann wird die Exe größer. Vieles hängt von den Libs ab, die man benutzt.

    Für MinGW gibts so einen strip-Befehl, der die exe um einiges kleiner machen kann. Schau mal auf der mingw-Homepage nach.



  • Danke für hilfreiche die Antwort.

    Mit etwas rumspielen kommt die .exe jetzt immerhin "nur" auf 250kb.

    Ich werde mich dann wohl näher damit beschäftigen, wenn ich irgendwann einmal Programme hinbekomme, die es Wert sind weitergegeben zu werden 😉

    Vorerst wäre meine Neugier dann gestillt.



  • Pseiko schrieb:

    Danke für hilfreiche die Antwort.

    Mit etwas rumspielen kommt die .exe jetzt immerhin "nur" auf 250kb.

    Jaaa, das ist etwas schräg. Wenn ich ein simples Hello World mit dem MinGW auf Win32 kompiliere, dann hab ich ne exe mit 250 kb (kein Debug-Krust drin). Nehm ich den gleichen Code und werf den g++ (gleiche Version wie MinGW) unter meinem Linux an, dann kommt nur noch ca. 20 kb raus.

    Da fragte ich mich auch schon öfters, wo denn da der Haken ist, hab's bis heute nicht rausgefunden. Interessanterweise kriegt aber der VC++ 8.0 die exe sehr klein, auch ca. 10-20 kb.

    Artchi schrieb:

    Für MinGW gibts so einen strip-Befehl, der die exe um einiges kleiner machen kann. Schau mal auf der mingw-Homepage nach.

    Ich wette den hat der OP schon drin 😉

    EDIT: Deutsch: mangelhaft 😉

    MfG

    GPC



  • Der aktuelle MinGW basiert meines Wissens noch auf den gcc 3.4er. Also schon ein paar Jahre alt.



  • Artchi schrieb:

    Der aktuelle MinGW basiert meines Wissens noch auf den gcc 3.4er. Also schon ein paar Jahre alt.

    Yupp, auch wenn ein paar Jahre übertrieben ist, v.a. der 3.4 ist noch nicht sooo alt, den hab ich nämlich unter Linux auch noch drauf und der ist auch Grundlage für die Daten im vorherigen Post. Also kann's daran nicht liegen.



  • Mit UPX werdens dann 71kb

    Welchen Compiler könnt ihr mir denn empfehlen?



  • Der MinGW soll ja nicht schlecht sein, er ist zumindest bei den Opensource-Leuten unter Windows ziemlich weit verbreitet. Wenn dich die Dateigröße stört, kannst du z.B. den MS VC++ 2005 Express Edition benutzen, der ist sehr gut und die IDE ist gleich dabei. Aber der Download ist nur für Leute Breitband-Internet zu empfehlen (ziemlich großes Installpacket).

    Offline-Installation (zu empfehlen): http://www.microsoft.com/germany/msdn/vstudio/products/express/manuelleinstallation.mspx

    Online-Installation:
    http://www.microsoft.com/germany/msdn/vstudio/products/express/visualc/default.mspx
    Das PlatformSDK nicht vergessen nachträglich zu installieren. 😉

    Dann gibts noch den Digital Mars C++ Compiler von http://www.digitalmars.com/. Ob er kleine exes erzeugt, weiß ich nicht.

    Es gibt noch kostenpflichtige Compiler (z.B. von Intel) aber ich denke, die suchst du nicht als Anfänger.



  • so weit ich das in erinnerung habe, benutzt der mingw zum teil eigene standardbibliotheken (nicht die von microsoft "msvcrt"). weil diese statisch gelinkt sind, werden die executables so groß.

    ich kann mich aber auch irren, denn ich habe gerade keine windows-entwicklungsumgebung installiert.



  • Artchi schrieb:

    Der MinGW soll ja nicht schlecht sein, er ist zumindest bei den Opensource-Leuten unter Windows ziemlich weit verbreitet.

    Er ist auch sehr gut. Aber unter einer Unix-Umgebung ist er besser als auf Win32, so wie der VC++ für Win32 besser ist als der MinGW. Am Ende nimmt sich das nicht viel.

    real programmer schrieb:

    so weit ich das in erinnerung habe, benutzt der mingw zum teil eigene standardbibliotheken (nicht die von microsoft "msvcrt"). weil diese statisch gelinkt sind, werden die executables so groß.

    Das wäre eine Erklärung für dieses Problem...und eine, warum ich die exes des VC++ nicht auf anderen Rechnern laufen lassen kann, ohne dass es mir ne Fehlermeldung um die Ohren schlägt.

    ich kann mich aber auch irren, denn ich habe gerade keine windows-entwicklungsumgebung installiert.

    Klingt vernünftig, schließlich haben wir unter GNU/Linux mit der GCC kleine binaries, da wird das dann wohl ähnlich gemacht.

    MfG

    GPC



  • GPC schrieb:

    ich kann mich aber auch irren, denn ich habe gerade keine windows-entwicklungsumgebung installiert.

    Klingt vernünftig, schließlich haben wir unter GNU/Linux mit der GCC kleine binaries, da wird das dann wohl ähnlich gemacht.

    compiliere mal ein einfaches hallo welt mit der compileroption -static unter linux ➡ schon hast du ein binary mit der stolzen größe von 1 MB.
    das dazugehörige dynamisch gelinkte binary kommt mit 7,6 kB aus... 😉

    mein compiler ist der gcc-3.4.6 unter gentoo.

    um meine vermutung zu bestätigen, müsste das mal einer von den windows-leuten testen, d.h. prüfen ob die binaries mit -static gleich groß sind wie die, die ohne diese option gelinkt wurden.



  • Okay, dann wird jetzt mal getestet, sowohl C und C++ als auch Linux und Win:

    Als Grundlage dienen diese Quellcodes:

    #include <iostream>
    
    int main() {
      std::cout<<"Hello World\n";
      return 0;
    };
    
    #include <stdio.h>
    
    int main() {
      puts("Hello World");
      return 0;
    };
    

    Fangen wir mit GNU/Linux an, ich hab Slackware 10.2 intalliert.

    Zuerst C++:

    The white race is the cancer of history.
                    -- Susan Sontag
    
    gpc@darkstar:~$ mkdir test
    gpc@darkstar:~$ cd test/
    gpc@darkstar:~/test$ g++ --version
    g++ (GCC) 3.3.6
    Copyright (C) 2003 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    
    gpc@darkstar:~/test$ g++ -o main main.cpp
    gpc@darkstar:~/test$ ls -ls
    total 24
    16 -rwxr-xr-x  1 gpc users 12756 2006-07-22 19:02 main*
     4 -rw-r--r--  1 gpc users    71 2006-07-22 19:01 main.c
     4 -rw-r--r--  1 gpc users    79 2006-07-22 19:02 main.cpp
    
    gpc@darkstar:~/test$ g++ -s -Os -o main main.cpp
    gpc@darkstar:~/test$ ls -ls
    total 12
    4 -rwxr-xr-x  1 gpc users 3904 2006-07-22 19:03 main*
    4 -rw-r--r--  1 gpc users   71 2006-07-22 19:01 main.c
    4 -rw-r--r--  1 gpc users   79 2006-07-22 19:02 main.cpp
    gpc@darkstar:~/test$
    
    gpc@darkstar:~/test$ g++ -static -o main main.cpp
    gpc@darkstar:~/test$ ls -ls
    total 3487
    3479 -rwxr-xr-x  1 gpc users 3556935 2006-07-22 19:04 main*
       4 -rw-r--r--  1 gpc users      71 2006-07-22 19:01 main.c
       4 -rw-r--r--  1 gpc users      79 2006-07-22 19:02 main.cpp
    gpc@darkstar:~/test$
    

    Wie du sagtest, mit -static geht die Größe ordentlich nach oben.

    Jetzt C:

    gpc@darkstar:~/test$ gcc --version
    gcc (GCC) 3.3.6
    Copyright (C) 2003 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions.  There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    
    gpc@darkstar:~/test$ gcc -o main main.c
    gpc@darkstar:~/test$ ls -ls
    total 20
    12 -rwxr-xr-x  1 gpc users 11035 2006-07-22 19:05 main*
     4 -rw-r--r--  1 gpc users    71 2006-07-22 19:01 main.c
     4 -rw-r--r--  1 gpc users    79 2006-07-22 19:02 main.cpp
    
    gpc@darkstar:~/test$ gcc -s -Os -o main main.c
    gpc@darkstar:~/test$ ls -ls
    total 12
    4 -rwxr-xr-x  1 gpc users 2844 2006-07-22 19:05 main*
    4 -rw-r--r--  1 gpc users   71 2006-07-22 19:01 main.c
    4 -rw-r--r--  1 gpc users   79 2006-07-22 19:02 main.cpp
    
    gpc@darkstar:~/test$ gcc -static -o main main.c
    gpc@darkstar:~/test$ ls -ls
    total 481
    473 -rwxr-xr-x  1 gpc users 482514 2006-07-22 19:05 main*
      4 -rw-r--r--  1 gpc users     71 2006-07-22 19:01 main.c
      4 -rw-r--r--  1 gpc users     79 2006-07-22 19:02 main.cpp
    gpc@darkstar:~/test$
    

    Gleiches bild, nur dass man wieder mal sieht, wie fett die iostream im Vergleich zur stdio ist 😞

    Auf'm Zweit-Rechner ist Win2k und der g++ 3.4.4 (mingw special) drauf. Gehen wir's an:

    C++:

    Ohne alles: 455 KB
    Mit -Os -s: 250 KB
    Mit -static: 455 KB

    D.h. unter Win kompiliert er standardmäßig static.

    C:

    Ohne alles: 14.9 KB
    Mit -Os -s: 5.5 KB
    Mit -static: 14.9 KB

    Auch hier kompiliert er standardmäßig static.

    Tjo, ich denke damit haben wir das Problem weitestgehend eruiert^^

    MfG

    GPC



  • Zu den Exe-File-Size verschiedener C/C++ Compiler:

    Result Bcc 4.0 :
    C-Demo : 55kB
    Cpp-Demo ohne Stl ( nicht eingebunden ) : 83kB

    Result free Bcc 5.5 :
    C-Demo : 47kB
    Cpp-Demo Stl-konform : 110kB

    - - - - -

    Result Digital Mars 8.45 :
    C-Demo : 40kB
    Cpp-Demo ohne Stl ( nicht eingebunden ) : 47kB

    Digital Mars 8.45 mit STLport 4.5.3 :
    C-Demo : 40kB
    Cpp-Demo alter Stil : 351kB
    Cpp-Demo Stl-konform : 354kB

    - - - - -

    OpenWatcom 1.3
    C-Demo : 14kB
    Cpp-Demo ohne Stl ( nicht eingebunden ) : 21kB

    Hab die aktuelle Version von OpenWatcom, die Stl können soll, noch nicht auf meinem Rechner.

    - - - - -

    Cpp-Demo ohne Stl = Cpp alter Stil ( ohne .h u.s.w. )

    Hab jetzt die Compiler-/Linkerswitches nicht dokumentiert, waren aber relativ sparsam im Einsatz.

    Demo-Code sonst wie beim Vortester.

    Geh ich von den Resultaten von Digital Mars aus ist die Integration der Stl für den grossen Code verantwortlich.

    MfG f.-th.



  • Hi,

    hab auch noch mal eine Frage. Ich arbeite mit VC++ 7.1 und kann unter den Projektoptionen ja die Runtime Library einstellen. Ich kann unter Single-Threaded, Multi-Threaded und Multi-Threaded DLL auswählen. Ich würde eigentlich nur Single-Threaded benötigen, wenn ich aber Multi-Threaded DLL auswähle wird meine EXE um gut 50 kB kleiner! Aber auf welchem Windows läuft meine EXE jetzt noch, wenn ich eine Runtime DLL benötige?

    Gruß
    *kleiner*



  • Du mußt dann die Runtime DLL mit deinem Programm ausliefern, wenn der Benutzer diese noch nicht in seinem system32 Verzeichnis liegen hat.



  • Hi Artchi,

    und welche DLL's sind das?
    Und was ist das Mindestsystem das der User haben muss, dass die DLL's schon im system32 Verzeichniss liegen? Win98, WinNT, Internet Explorer > ver. 4 ???

    Gruß
    *kleiner*



  • f.-th. schrieb:

    Geh ich von den Resultaten von Digital Mars aus ist die Integration der Stl für den grossen Code verantwortlich.

    Jein. Es ist eher die iostream Lib die so fett ist, die anderen sind gar nicht mal so schlimm...



  • Das sind dann die msvcrt71.dll glaub ich. Normalerweise wird das dem User angezeigt, welche DLL nicht gefunden wird. Man müsste nochmal in die MSDN2003 reinschauen, um die genauen RT DLLs für MSVC-Programme rauszufinden.

    Die letzte crt die bei Windows (auch XP) beiliegt, ist glaub ich die 4er oder 6er Version. Denn WinXP kam noch vor VC++7.0 raus. Also mußt du davon ausgehen, das der User keine passende crt im System32 drin liegen hat, außer ein anderes Programm hat diese dort schon reingeschoben.



  • Habe auf der Dusmania einen Vortrag darüber gehalten. Habe dort geziegt wie man ein "Hallo Welt"- Beispiel von 48k (mit Standard VC8 Express Einstellungen) auf 2kb runterschraubt. Mit Packen wird es natürlich nochmal deutlich kleiner. Ich denke mal, das sollte mit jedem Compiler auf ähnliche Weise möglich sein.

    Gruß, TGGC (\-/ returns)



  • TGGCatWork schrieb:

    Habe auf der Dusmania einen Vortrag darüber gehalten. Habe dort geziegt wie man ein "Hallo Welt"- Beispiel von 48k (mit Standard VC8 Express Einstellungen) auf 2kb runterschraubt. Mit Packen wird es natürlich nochmal deutlich kleiner. Ich denke mal, das sollte mit jedem Compiler auf ähnliche Weise möglich sein.

    nett, gibt's den Vortrag evtl. in Schriftform?

    MfG

    GPC


Anmelden zum Antworten