Frage zu Kompilatgröße



  • Entschuldigung, falls es hier nicht hinein gehört.

    Ich arbeite mit Code::Blocks und zwei versch. Büchern um C++ zu lernen. Mir ist aufgefallen, dass meine kompilierten Programme, die vom Umfang ja wirklich sehr überschaubar sind (Programmbeispiele aus dem Buch hauptsächlich), viel Platz belegen.

    Die Kompilatgröße beträgt immer so um 500kb. Woran liegt das, muss ich da am Compiler (MinGW) noch was ändern, oder wieso sind die so groß?

    Danke für eure Tipps.



  • a) wenn du etwas inkludierst wird alles davon reingebunden, selbst Sachen die du nicht benutzt
    b) Debug aktiviert? Debug-Informationen belegen ordentlich Platz.

    Binaries mit 1GB Größe sind da keine Seltenheit.

    Unter Linux gibt es da den schönen Befehl "strip". So werden aus einem 101MB Binary eines mit 6,1MB. 😉



  • zu a) Selbst das typische HelloWorld ergibt eine 500kb-große EXE-Datei.
    zu b) Wo kann ich das überprüfen? Da ich absoluter Neuling auf diesem Gebiet bin, und Code::Blocks ja die Kompilierung übernimmt, habe ich keinen blassen Schimmer worauf ich achten muss.



  • a ) Ein Hello World Programm benutzt cout.
    Sprich du inkludierst <iostream>.
    Da ist dann std::cout, std::cin und alle Methoden von
    den Streams drin. Öffne einfach mal <iostream> und klick dich durch die Header.
    Dann wirst siehst du wieviel so ein einfaches std::cout braucht.

    b ) Build->Select Target->Release/Debug



  • Fusel.Factor schrieb:

    Öffne einfach mal <iostream> und klick dich durch die Header.
    Dann wirst siehst du wieviel so ein einfaches std::cout braucht.

    Ich bin nur verwundert, dass andere bei gleichem Programm auf wesentlich weniger große EXE-Dateien kommen...

    Fusel.Factor schrieb:

    b ) Build->Select Target->Release/Debug

    Ah! Das hat schon was gebracht. Die Dateien sind jetzt "nur" noch ca. 270kb groß. Aber wie schaffen es andere ein HelloWorld-Programm in eine 30kb große EXE-Datei zu packen?



  • Hello World - 28 kB mit VS6 als Release



  • Da gibt es mehrere Möglichkeiten.

    1. Durch dynamisches Linken, dann musst du halt immer einer dll mit dir
      herumschleppen.

    http://de.wikipedia.org/wiki/Dynamic_Link_Library

    1. Durch Optimierungen. Manche Compiler können soweit optimieren, sodass
      sie wirklich nur die Funtkionen erstellen, die auch wirklich benutzt werden.


  • Was machen eure Compiler denn alles bei einem HelloWorld Programm?!
    Oder linkt ihr statisch?

    $ cat hello.cpp
    #include <iostream>
    
    int main()
    {
            std::cout << "Hello world!" << std::endl;
            return 0;
    }
    $ g++ -o hello hello.cpp && dir hello # quick and dirty
    -rwxr-xr-x 1 lagalopex users 8,6K 20. Aug 15:07 hello
    $ g++ -o hello -Os -s hello.cpp && dir hello # auf Groesse optimiert und "gestrippt"
    -rwxr-xr-x 1 lagalopex users 6,4K 20. Aug 15:08 hello
    $ g++ -o hello -ggdb hello.cpp && dir hello # Debug-Version
    -rwxr-xr-x 1 lagalopex users 41K 20. Aug 15:08 hello
    


  • In dem Contest-Thread steht auf den letzten Seiten ein Link zu Tipps wie man mit dem VC auch ein Hello World Programm mit nur 1kB hinbekommt.



  • Mich hats nur gewundert, da ich nichtmal mit der Debug Version auf 50kB komme (was immernoch Faktor 10 kleiner wäre)... und ich kann mir kaum vorstellen, dass Programme standardmäßig statisch gelinkt werden.
    Aber ok 😉

    Und klar, kriegt man die Programme winzig klein. Die Frage ist nur, wie sinvoll, praktikabel und portabel es ist.



  • Habe in den Compiler-Einstellungen nun die Optionen -Os und -s aktiviert.
    Programm ist immer noch 270.5kb groß...



  • Wenn ich im Codeblocks Forum lese, scheint es wirklich so zu sein, dass es statisch gelinkt wird. 🙄



  • Ich hab hier eine 6 KB exe die unter Windows einen Text aus einer Textdatei lädt und in einem Fenster mit einem Button anzeigt und dann noch ein wenig anderen Kram macht. 😉

    Kompiliert mit VC6. Alles eine Frage der Kompiler-Einstellungen ...

    Ich hab grad mal nach einem Tutorial dafür gesucht aber auf die Schnelle nichts gefunden. Ich kenn Code::Blocks nicht, aber da sollte ähnliches möglich sein.

    "Lernen" tut man sowas wenn man sich mit 64kb Intros befasst.


Anmelden zum Antworten