gcc/g++ C++ Programm helloworld ist ca



  • Mein Helloworld Programm hat eine Dateigröße von fast einem MB!
    Ich verwende mingw gcc 4.5.0.
    Ich kompiliere mit g++ hw.cpp -Os (Os= optimierung auf dateigröße).
    Der vergleichbare C-Code ist ca 30 kB groß.

    Wie kann ich mein Programm auf eine "ähnliche" Größenordnung reduzieren?

    #include <iostream>
    
    int main()
    {
        std::cout<<"C++: helloworld"<<std::endl;
        return 0;
    }
    


  • CmdShell öffnen:
    <pfadzumingw>\strip.exe <deinprogramm>

    rya.


  • Mod

    Das -Os hilft da gar nichts, das optimiert bloß deinen eigentlichen Programmcode (welcher nur ein paar Bytes lang sein wird). Die enorme Größe kommt durch die Laufzeitbibliothek die bei dir anscheinend statisch dazugelinkt wird. Mit strip wirst du das ein bisschen reduzieren können, aber nicht wesentlich.

    Warum das Programm statisch gelinkt wird ist mir jedoch ein Rätsel, eigentlich ist die Standardeinstellung beim GCC dynamisches Linken, wodurch du ein sehr kleines Programm erhalten solltest (z.B. 11k bei meinem nativen Linuxsystem). Hängt das vielleicht irgendwie mit mingw zusammen? Ich kenne mich damit nicht aus. Es wundert mich jedenfalls, dass die C-Version offenbar dynamisch gelinkt ist, die C++ Version aber nicht.



  • Bei mir ist es 9216 Bytes groß. Mingw mit GCC 4.5.0. Standardeinstellungen.


  • Mod

    Hmm, gibt es einen geheimen Schalter beim GCC um ihn zum dynamischen Linken zu zwingen? Ich kann nichts finden, weil man ja naturgemäß -static angeben muss, um überhaupt statisches Linken zu bekommen. Für libgcc gibt es einen Schalter, aber das nützt für C++ herzlich wenig und ist auch eigentlich für andere Zwecke gedacht.

    Wenn ich die Doku richtig verstehe wird aber libstdc++ statisch gelinkt, dann und nur dann wenn keine passende Objektdatei für dynamisches Linken gefunden wurde. Dies lässt mich zu der Vermutung kommen, dass diese eventuell fehlt? Der Dateiname müsste so etwas wie libstdc++.so sein (heißen shared objects in mingw auch .so? Oder sind das da .dll?).

    edit: Und hier die man-Seite für den Linker, vielleicht wird jemand anderes daraus schlauer als ich:
    http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html


Anmelden zum Antworten