Samstag, Juni 6, 2020

Reduzieren ausführbare windows-Datei-Größe

Ich habe ein C++/MFC-Anwendung, die auf windows – dynamisch verknüpfte es ist nur 60kb statisch, es ist > 3 MB.

Es ist ein Wesen verteilt, um Kunden per E-Mail und so muss möglichst klein sein.

Es statisch links die MFC und MSCVRT Bibliotheken – da ist eine Korrektur um einige Probleme und ich will nicht mehr support-Anrufe über fehlende libs – vor allem die sehr hilfreich „Anwendungskonfiguration falsch ist‘ ein!

Ist es eh zu Streifen, ein Windows-exe-Datei, die alle zusätzlichen MFC-Zeug, das ist die dll aber, dass ich nicht mit?

Oder sagen Sie es dynamisch zu verlinken MSVCRT (muss vorhanden sein), aber statisches linken der MFC-dll, die möglicherweise nicht werden?

Bearbeiten – danke, die haben es bis zu 1,6 Mb, die haben zu tun!

4 Kommentare

  1. 7

    Können Sie nicht mischen die CRT/MFC dlls. Geht aus dem Gedächtnis…

    Als die anderen Antwort vorgeschlagen, Sie können #define WIN32_LEAN_AND_MEAN und VC_EXTRALEAN. Diese wird wahrscheinlich nicht helfen, wenn. Sie neigen dazu, über die Minimierung von Bauzeit – nicht die endgültige exe-Größe.

    Kurzen Umbau MFC (Das ist eine option – man könnte es neu erstellen /Os, oder wenn Sie das Gefühl wirklich frech, /GL – doch dies wird wahrscheinlich führen zu mehr downstream-Spaß – hoffentlich ist es bereits gebaut /Gy).

    OK. Einfache Dinge zu versuchen. Bauen Sie Ihre app /GL /Os /GF /Gy /GA. In der linker Sie mehr oder weniger wollen /OPT:REF “ und “ /OPT:ICF und /LTCG.

    Muss ich sagen – ein release erstellen von 30k auf MB ist ein bisschen viel. Man könnte auch pass /Karte: dem linker und sehen, was alles mitzunehmen, was Raum – aber das ist sehr sehr tedius.

    Es klingt fast so, MFC wurde nicht gebaut /Gy – aber das wäre überraschend.

  2. 7

    Ich bin mir nicht sicher, wie die Leiste ausführbar, aber ein anderer Gedanke ist, zu komprimieren, zum Beispiel mit upx, die entpacken Sie es und führen Sie es an Ort und Stelle… Bedeutet das reduzieren der Größe genug für Sie?

    • UPX ist hervorragend, eine meiner apps ist 6mb vor und 2mb nach upx!
  3. 4

    Für Programme, die mit der CRT, können Sie die Technik in in diesem video von Pro Vognsen auf die Erreichung 3.5 KB ausführbaren Dateien. Windows\System32\msvcrt.dll Lieferumfang jedes Windows seit 95, also durch die Verknüpfung, dass Sie nicht brauchen, Paket Visual C++ Redistributable mit Ihrer app.

    Der grundlegende Prozess ist:

    1. Führen Sie Visual Studio dumpbin auf System32\msvcrt.dll und die pipe in eine Datei
    2. Führen Sie einen einfachen filter (awk '{print $4}') zum erstellen einer msvcrt.def Datei
    3. Run VS ist lib auf msvcrt.def zu generieren msvcrt.lib
    4. Deaktivieren Standard-Bibliotheken in Ihrem Projekt (/NODEFAULTLIB auf die link Befehlszeile)
    5. Deaktivieren Sie einige Visual C++ Prüfungen (/GS- und entfernen Sie alle /RTC<x> flags)

    Link gegen kernel32.lib und msvcrt.lib – und voilà, Ihr winzige ausführbare Datei hat keine Abhängigkeiten außer dem OS.

    (n.b.: Größe optimiert (/O1), geben Sie memset intrinsische detaillierte hier.)

  4. 1

    Können Sie versuchen, Dependency Walker zu überprüfen, welche DLLs, die Ihre statische EXE-Datei hängt sich auf, dann, wenn es von einer Bibliothek abhängig, die Sie sicher sind, es existiert auf Ihrem Rechner, können Sie kompilieren, ohne es und verringern Sie die Größe.

Kostenlose Online-Tests