Warum sind Die EXEs sooo gigantisch?
-
Hallo! Wie kann ich meine Programme mit dem C++ Builder kleiner machen? Das eine Programm hat bei mit 600 kb. Wie kann ich es kleiner machen? Liegt das an VCL.h? Soll ich lieber meine Programme ohne VCL schreiben?
-
Hallo
Durch das große Framework werden VCL-Programme in der Tat etwas größer. Natürlich nur einmalig. Bei mehreren Forms und vielen Komponenten steigt die Größe dann kaum noch an. Wenn du mehrere Programme/DLLs hast lohnt es sich auch die entsprechenden Laufzeitpakete nicht in die einzelnen Module einzubinden.
Wenn du unbedingt dein Programm verkleinen willst dann must du reine WinAPI-Programme schreiben. Die greifen auf ein Framework zurück was auf jedem Windows-Rechner schon vorhanden ist.
bis bald
akari
-
Daß C++Builder-Programme eine Dateigröße bei im Minimalfall etwa 600 KB erreichen, hat die folgenden Gründe:
- einige Teile der C++-Standardbibliothek, darunter locale und iostream, verursachen, u.a., da sie massiv mit Templates arbeiten und sehr lange Typnamen erzeugen, etwas über 100 KB.
- VCL und RTL, genauer: eine Menge RTTI, die globalen Objekte (Application, Screen, Mouse, ...), das Persistenzframework sowie sämtliche RTL-Funktionalität, auf die von dort aus zurückgegriffen wird, sind für den größten Teil des Rests verantwortlich.
Dieser Aspekt hat, wie akari ausführte, nur einmaligen Effekt. Dies liegt primär daran, daß die VCL-Formulare ressourcenbasiert sind und vom Persistenzframework zur Laufzeit geladen und instantiiert werden. - der Linker beläßt einige nicht benötigte Informationen in der EXE-Datei, z.B. einige Bitmap-Ressourcen sowie die Relocation-Tabelle, die nur bei DLLs benötigt wird (EXE-Dateien werden unter Win32 immer an eine fixe Stelle im virtuellen Speicherbereich geladen)
Wenn du die Dateigröße eines Programmes reduzieren willst, kannst du auf eine der folgenden Methoden zurückgreifen:
- falls dein Programm ohnehin sehr groß ist: mittels Packages und DLLs modularisieren und VCL und RTL dynamisch einbinden.
- das Programm bei der Distribution in ein Archiv packen oder einen Installer mit guter Kompressionsrate (z.B. InnoSetup, der LZMA unterstützt) verwenden
- die Relocation-Tabelle aus der .EXE-Datei entfernen, z.B. mit StripReloc.
Im C++Builder 2006 und höher kann dieser Schritt mit einem Post-Build-Event automatisiert werden. Dazu wähle man im Kontextmenu des Projekts im Projektmanager den Menupunkt Build-Ereignisse|Post-Build aus und trage folgende Kommandozeile ein:
<full_path>\StripReloc.exe /C (PROJECTDIR)Release\_Build\\(PROJECTNAME).exe - wenn es unbedingt sein muß: die ausführbare Datei mit UPX packen. Im Allgemeinen ist das allerdings nicht empfehlenswert. Einige Argumente gegen dieses Verfahren hat Jordan Russell hier unten aufgelistet.
- wenn du zu viel Zeit hast: auf die VCL verzichten und alles von Hand machen.
Darf ich nebenher mal anmerken, daß dieses Thema sich zu den Frequently Asked Questions zählen kann?
-
Also ich habe hier eine Exe mit 175 Formularen, komplette Instandhaltungssoftware, 5 Mannjahre. Das Teil ist nicht statisch gelinkt und erreicht gerade mal eine Größe von 6,5 MB ohne Debugsymbole. Also locker bleiben.
-
Hallo
Ja warten wir ob noch jemand anders etwas dazu zu sagen hat, dann nehmen wir das in die FAQ auf.
bis bald
akari
-
Danke für die schnelle Antworten! Habe ich alles gemacht (außer auf VCL verzichten) und die datei ist 195 kb groß. immer noch viel finde ich. Für nur ein Formular das nicht besonders viel macht.
-
Es gibt da ein Packprogramm, nennt sich glaub upx
-
Hallo
Linnea hat upx schon erwähnt.
/Edit : audacia wars...
bis bald
akari
-
ich? nicht wirklich
allerdings frage ich mich was an 600kB so groß ist, weder Festplatten noch RAM haben damit heutzutage ein Problem. OK, auf nem Handheld oder ähnlichem kanns etwas enger werden, aber auch da werden die Karten eher größer als kleiner. Und die Datei übers I-Net zu versenden geht bei der Größe sogar mit Modem.
-
Update: In fairness, this was written several years ago. This very well may no longer be an issue today.
Die Gründe UPX nicht zu nutzen sind quasi ja wohl nicht gegeben. Trotzdem danke für den Link von StripReloc.
So zur Info. eine ca 4MB EXE wird mit UPX unter 1MB klein. Da wir diese teilweise über Satellit senden und soetwas seeeehr teuer ist, ist klein sein ein muss. Ansonsten dürfte das ziemlich egal sein, bei 1 Terrabyte Festplatten. *lach*
Aber mal andere Frage:
ASPack sieht genauso aus wie UPX welches OpenSource und kostenlos ist. Haben die das geklaut und verkaufen das an Unwissende oder wie muss man das verstehen?
-
Hi,
soweit ich weiß, (war zumindest wohl früher so) muß immer die gesamte VCL gelinkt sein, weil Du ja den Klassennamen der Klasse die erzeugt werden soll auch über ein Edit-Feld eingeben kannst und der Linker nicht wissen kann was Du mal verwenden willst.
Gruß Mümmel
-
UPXler schrieb:
Update: In fairness, this was written several years ago. This very well may no longer be an issue today.
Die Gründe UPX nicht zu nutzen sind quasi ja wohl nicht gegeben.
Doch; das "Update" bezieht sich nur auf den letzten Punkt mit den Virus-Scannern. Die anderen beiden Argumente sind nach wie vor gültig.
UPXler schrieb:
So zur Info. eine ca 4MB EXE wird mit UPX unter 1MB klein. Da wir diese teilweise über Satellit senden und soetwas seeeehr teuer ist, ist klein sein ein muss.
ZIP/RAR?
muemmel schrieb:
soweit ich weiß, (war zumindest wohl früher so) muß immer die gesamte VCL gelinkt sein, weil Du ja den Klassennamen der Klasse die erzeugt werden soll auch über ein Edit-Feld eingeben kannst und der Linker nicht wissen kann was Du mal verwenden willst.
Das fällt unter die von mir bereits genannten Punkte RTTI und Persistenzframework.
So ganz richtig ist es außerdem nicht (und das war es auch früher nicht): grundsätzlich läßt der Linker durchaus alles, was nicht direkt benutzt wird, weg (sonst wäre eine normale EXE-Datei so groß wie alle VCL-Packages zusammengenommen, also irgendetwas im zweistelligen MB-Bereich ;)). RTTI steht demnach nur für verwendete Klassen zur Verfügung. Allerdings kann man bei Bedarf die Einbindung der RTTI für eine Klasse mittels RegisterClass erzwingen (hier ein Artikel zu diesem Thema).Edit: muemmel mit UPXler velwechsert
-
Ja stimmt, bezog sich auf den Virenscanner. Allerdings sind die beiden anderen Punkte doch Unfug. Zum einen hat heute keiner mehr 32MB RAM, wo man gross an Limits stössen könnte, noch macht eine kleine EXE derartige Performance Probleme. Da müsste schon das System wegen ganz anderen Dingen aufn Zahnfleisch krauchen. Auch den Punkt mit den multiplen Instanzen kann ich nicht nachvollziehen. Ich starte eine normale EXE und jede Instanz davon hat knapp 5MB laut Task-Process-Manager. Ich starte eine komprimierte EXE und diese hat knapp 6MB pro Instanz. Wo ist da ein signifikanter Unterschied?
Wenn man ein paar LIBs ins Projekt include, dann wird es schonmal 4-6MB gross. Kein Beinbruch, aber wer mit Diksetten gross geworden ist, der hat wohl den Hang es kleiner haben zu wollen, damit es "kompakt ausschaut".
Ich sehe in UPX keinerlei Nachteile. Ich will aber auch nicht streiten, jeder wie er mag und möchte und bei Standalone Anwendungen die nur eine Instanz zulassen (wie bei meinen) ist der Punkt "multiple Instanzen" so oder so irrelevant.
P.S. Letztes Zitat von dir war "muemmel"
-
Gerade der letzte Punkt ist auch heute noch gültig...
ich packe eines meiner Programme mit UPX und sieben Virenscanner auf http://www.virustotal.com/ stufen es danach als verdächtig ein. Bei anderen Programmen ist es ähnlich (teils mehr, teils weniger).
Und manche unbedarfte Benutzer schaffen es nicht, die Ausnahmeliste alleine zu verändern... bzw. es scheint in manchen Fällen gar nicht möglich zu sein (AVG PE ist hier ein Problem - auch dadurch, dass es weit verbreitet ist).
Das Motto der meisten Antivirensoftware-Firmen scheint heute "lieber einen Alarm zu viel als zu wenig" zu sein.
-
UPXler schrieb:
den Punkt mit den multiplen Instanzen kann ich nicht nachvollziehen. Ich starte eine normale EXE und jede Instanz davon hat knapp 5MB laut Task-Process-Manager. Ich starte eine komprimierte EXE und diese hat knapp 6MB pro Instanz. Wo ist da ein signifikanter Unterschied?
Das ist auch eher bei DLLs signifikant. Solange du nur deine ausführbare Datei packst, ist das nahezu unproblematisch.
Bei sehr großen ausführbaren Dateien ist aber auch heute das Argument nicht ganz von der Hand zu weisen, daß Windows, wenn die Datei ungepackt vorliegt, nur die benötigten Code-Pages in den Speicher laden muß, wohingegen eine UPX-komprimierte Datei komplett in den Arbeitsspeicher entpackt wird.Ob UPX nun empfehlenswert ist oder nicht, ist freilich individuell abzuwägen. So wie dir die Nachteile verschlossen bleiben, finde ich die Vorteile irrelevant.
UPXler schrieb:
P.S. Letztes Zitat von dir war "muemmel"
Richtig; bitte entschuldige meine Unaufmerksamkeit. Ich habe es geändert.