[wxWidgets]Fertig compilierte Exe-Datei riesengross.



  • Hi,

    Ich fange gerade damit an, unter Windows mit wx-DevCpp zu programmieren, und musste feststellen, das die resultierende exe ganze 3.7 MB gross ist, obwohl ich einfach nur ein Fenster erstelle und darin eine einfache OpenGL Szene zeichne.

    Kann das daran liegen, das der Linker per Voreinstellungen von DevCpp-wx unmengen von Libs einbindet (siehe weiter unten)? Ich kann mir nicht vorstellen, das wxWidgets den ganzen Kram braucht (zumindest nicht in einem so einfachen Projekt).

    Kann mir jemand sagen, welche libs ich für eine einfache wxWidgets GUI brauche?

    Linker Voreinstellung DevCpp-wx

    -lwxmsw25
    -lwxmsw25_gl
    -lwxtiff
    -lwxjpeg
    -lwxpng
    -lwxzlib
    -lwxregex
    -lwxexpat
    -lkernel32
    -luser32
    -lgdi32
    -lcomdlg32
    -lwinspool
    -lwinmm
    -lshell32
    -lcomctl32
    -lole32
    -loleaut32
    -luuid
    -lrpcrt4
    -ladvapi32
    -lwsock32
    -lodbc32
    -lopengl32
    ../../DevCpp_wx/lib/libglu32.a <--- die hab ich nachträglich eingetragen
    ../../DevCpp_wx/lib/libglut32.a



  • RTFM! Welche Libs du brauchst, findest du hier



  • Danke für den Link. Sind die gelinkten libs nun wirklich die Ursache für die ungewöhnliche Grösse der Datei ?



  • Woher soll das sonst kommen?

    Link einfach mal dynamisch und du siehst welchen Teil die Libraries ungefähr ausmachen. Naja, der Overhead ist zwar konstant. Aber so sieht das eben aus, wenn man ein Wrapper um ein Wrapper als Library nimmt 🙂



  • Die Groesse bleibt unverändert bei 3,82 MB , obwohl ich den Linker um die Hälfte erleichtern habe. So gewichtige Sachen wie Kernel32, User32, WinSock usw. hab ich rausgeworfen. Kompilieren tut es, jedoch ändert sich die Grösse nicht.

    Kann es sein, das das vielleicht daran liegt, das ich wxWidgets - Klassen ableite und somit risiegen Code erbe, den ich eigentlich garnicht brauche ?

    Hat hier vielleicht jemand das gleiche Prob mit wxWidgets gehabt ? (Hoffenlich 🙂 )



  • Hi! wxWidgets ist ziemlich bekannt fuer grosse EXE-Dateien. Ich kann mich erinnern, ein einfaches "Hello, World" war bei mir mal 2 MB gross. Hab dann aber nicht lang dran rumgeschraubt. Ich empfehl dir, dringend mal "strip" und "upx" anzuschauen.
    "Strip" findest du beim MinGW dabei; d.h. ist auch in Dev-C++ dabei. Soweit ich mich erinnere gibts sogar "Project->Project Options" irgendwo eine Option "strip executable", damit ruft Dev-C++ das automatisch nach dem Kompilieren auf. Strip entfernt einfach alle nicht benoetigten Symbole aus der Exe.
    Danach kannst du UPX verwenden. UPX ist ein Packprogramm, das exe's so komprimiert, dass sie immer noch ausfuehrbar sein. UPX findest du IIRC bei Sourceforge, und sonst halt mit google 😉

    Mit den beiden Tools solltest du deine exe auf unter 1 MB bringen koennen denk ich 🙂



  • wenn man ein Wrapper um ein Wrapper als Library nimmt

    wie meinst du das? wxWidgets ist doch ein direktwrapper?!



  • hi schrieb:

    wenn man ein Wrapper um ein Wrapper als Library nimmt

    wie meinst du das? wxWidgets ist doch ein direktwrapper?!

    wxWidgets -> GTK -> Xlib



  • ok, aber auf windows nicht!! :p



  • wxWidgets wrappet direkt die Win32 API. Müsste eigentlich alles klein sein. 😉



  • Hat sich da mittlerweile eigentlich was getan? Ich habe auch nur ne kleine Anwendung mit ein paar TextCtrls und Fileoperations und die ist trotz strip und optimize size option gleich mal 2,7 MiB groß. (Statisch gelinkt, weils ja auch ohne die wxWidgets DLLs auf anderen Rechnern laufen soll)


  • Mod

    Ja, bei statisch kann das schon passieren. Du solltest allerdings auch im Release Modus bauen (auch wxWidgets).
    Und natürlich nicht als monolithic.



  • Release hab ich. Aber mein wxWidgets Build ist leider Monolithic. Da komm ich um nen neuen Build nicht drum rum, oder?

    Monolitisch heisst ja eigentlich aus einem Guss, aber was ist dann an der nicht monolischen Version anders?



  • Monolithic oder nicht sollte für die EXE egal sein. Jeder halbwegs vernünftige Linker wird eh nur die Funktionen zur Exe linken, die auch benötigt werden. Aus welcher Lib die kommen ist dabei egal.

    Das Problem bei wx schein mir zu sein, das wegen der Serialisierungs-Funktionen ein Haufen Quatschkram mitgelinkgt wird, obwohl man den eigentlich so gut wie nie braucht. WX muss auch darum einen Haufen überflüssigen Mist mit linken, weil es zur Compile-Zeit ja noch gar nicht weiss, welche Sachen zur Laufzeit dynamisch per XML-Ressource erzeugt werden. So landet halt ein Haufen unnötiger Müll in der Exe.

    Das einzige was du machen kannst ist über die Einstellungen alles was du nicht benutzt zu deaktivieren (in der setup.h).


  • Mod

    Die nicht monolithische Version besteht aus den verschiedenen Libraries.

    Nutzt du XRC? Weil XRC sehrviele Abhängigkeiten zu den anderen wxLibs mitbringt imho.



  • Nein, ich nutze kein XRC. Das mit dem MONOLITHIC=0 muss ich bei Gelegenheit mal ausprobieren, wenn ich mal wieder einen neuen Build erstelle.


  • Mod

    Na dann ist ja die Ursache gefunden.

    XRC ist übrigens durchaus einen Blick wert.



  • Hab jetzt mal nen Build mit MONOLITHIC=0 erzeugt und das Projekt nicht mon. kompiliert. An der Dateigröße hat sich aber nix geändert. Naja, was solls, muss mich wohl damit abfinden. Komprimieren lassen sich die Exen wenigstens ganz gut: 2,8 MB Original -> ZIP 1,1 MB, RAR 870 KB.


Anmelden zum Antworten