DarkDragon hat geschrieben:Danke für den Tipp

. Aber viele Leute behaupten man könne auch ohne "rumdoktorn" mit C++ unter 5 kB kommen.
Hallo DarkDragon,
das hat nichts mit der Sprache C++ zu tun, sondern eher mit dem
Prozess des Kompilierens mit einem bestimmten Compiler(-system).
In Deinem speziellen Fall betrifft es den Linker.
Davon abgesehen ist Dein gezeigter Code nur C, nicht C++.
Ich habe mir jetzt extra mal wieder DevC++ installiert und komme
mit Deinem Code auf eine .EXE von 3kb.
DevC++ Version ist 4.9.9.2 (GCC 3.4.2, LD 2.15.91).
Dazu gibst Du unter "Projekt Optionen > Parameter > Linker"
folgendes ein:
Code: Alles auswählen
-lkernel32
-luser32
-lgdi32
-lopengl32
-s
-nostdlib
--entry _WinMain@16
Die ersten 4 Zeilen teilen dem Linker mit welche Import-Libraries
er verwenden soll. Die ersten 3 sind Standard-WinAPI, die letzte
für OpenGL.
Wenn Du später weitere Libs benutzt, mußt Du die dort hinzufügen,
z.B. "-lglu32", "-lglut32" usw.
Die Linker-Option "-s" nimmt unbenutze Symbole aus dem Ergebniss
heraus.
Damit kommst Du wohl auf ca. 6,5kb.
Die letzten 2 Optionen sind nun entscheidend:
"-nostdlib" teilt dem Linker mit keine Standard-(C/C++)-Bibliotheken
einzufügen. Da Du keine C-Befehle (malloc etc.) benutzt, sondern
nur reines WinAPI, ist das kein Problem.
Mit "--entry _WinMain@16" setzt Du nun den Einsprungspunkt in
Deinem Programm. Dieser ist standardmässig in der Standardbibliothek,
die wir aber vom Linken ausgeschlossen haben.
Wenn Du nun Standard-C-Funktionen verwenden möchtest, dann
wird es zu einem Fehler kommen, da wir die Standardbibliothek
ja nicht benutzen.
Hier wird ein Linkerfehler kommen, da die Funktion "malloc" nicht
eingebunden wird. Dafür gibt es verschiedene Workarounds.
In diesem Beispiel könntest Du Dir ein eigenes "malloc" schreiben,
welches dann WinAPI-Funktionen benutzt (Global-/LocalAlloc oder
über die Heap-Funktionen).
Oder Du bindest die DLL "CRTDLL.dll" ein, so wie das auch PureBasic
macht. Wie der Name schon sagt, ist das eine C-Runtime-DLL mit
den C-Funktionen in einer DLL. Diese DLL ist seit Win95 mit dabei,
also überall vorhanden (sonst könnte es PB ja auch nicht verwenden).
Mit anderen C-Funktionen (strlen, printf usw.) ist es genauso.
Entweder selbst schreiben oder aus CRTDLL importieren.
Welche Funktionen enthalten sind findest Du sicherlich im MSDN,
oder Du schaust Dir die Exports dieser DLL mit meinem
PE-Viewer an.
Nun gibt es bei Deinem Beispiel noch einen kleinen Trick.
Für CreateWindow() verwendest Du den Titel "edit", was eine statische
Zeichenkette ist, die in der .EXE in die Sektion mit initialisierten
Daten kommt.
Wenn Du keine inittialisierten Daten verwendest (static, "chararray", ...),
dann kann man sich diese Sektion (".rdata") sparen. Somit wird Dein
Beispiel nochmals um 0,5k kleiner - ist also dann 2,5k.
Dazu mußt Du die statische Zeichenkette ersetzen:
Code: Alles auswählen
char title[] = { 'e','d','i','t',0 };
HDC hDC = GetDC( CreateWindow( title, 0, ....
Du kannst es auch mal mit einem anderen C-Compiler probieren,
beispielsweise LCCwin32, PellesC oder andere.
Ich habe früher schon größere OpenGL-Beispiele in 1,5k oder 2k
untergebracht, und sogar GUI-Programme mit C++ (mit eigenem
OOP-Klassensystem) geschrieben, die dann mit 7-9k auskamen.
Das Prinzip (Standardbibliothek vom Linken ausschließen
und neuen Einsprungpunkt setzen) ist dabei eigentlich immer das gleiche.
Mit C ist das, wie oben aufgezeigt, ziemlich einfach. Wenn man mit
C++ eigene Klassen schreibt, dann muß man noch etwas mehr
beachten. So muß man dann z.B. die Operatoren "new" und "delete"
in seinen Klassen selbst implementieren, wenn man die Standard-
bibliothek nicht nutzen möchte.
Ich hoffe Dir hiermit ein wenig geholfen zu haben! Happy Coding...
