In Dev C++ kompilierte Programme sind deutlich größer
-
Ich verwende Orwell Dev C++. Jetzt habe ich mir mal gedacht, ich könnte ein Programm welches ich in Dev C++ programmiert habe doch einfach mal in Visual Studio kompilieren. Da ist mir etwas äußerst Merkwürdiges aufgefallen. Die EXE-Datei, die in Visual Studio kompiliert wurde ist deutlich kleiner, von der Größe her (106 KB), als die EXE-Datei, die in Dev C++ kompiliert wurde (1.620 KB). Ich habe mir gedacht, der Größenunterschied liegt daran, weil der Dev C++ Compiler der erstellten EXE-Datei wirklich ALLES mitgibt was sie zum Funktionieren benötigt, wobei der Visual Studio Compiler allerdings der EXE-Datei nur das nötigste mitgibt. Das in Visual Studio erstellte Programm greift dann meiner Meinung nach auf Systeminterne Dlls oder sonstigen Extradateien zu, wie vielleicht auf einige Dateien des NET-Frameworks.
Nun meine Frage: Kann man dem Visual Studio Compiler irgendwie sagen, dass er in die von ihm erstellte EXE-Datei wirklich alles packt, was sie zum Funktionieren benötigt, wie es der Dev C++ Compiler macht? Denn wenn man die in Visual Studio kompilierte EXE-Datei dann auf anderen Windows Systemen ausführen will, dieses Windows System allerdings nicht die berüchtigte Dll besitzt, so wird das Programm auf diesem externen Windows System nicht funktionieren oder?
-
Für C++: In den Projecteinstellungen "C/C++ -> Codegenerierung -> Laufzeitbibliothek
MSDN - Use Run-Time LibraryFür C++/CLI geht das allerdings schwer, da .NET immer als eigenständiges Framework genutzt wird, das kannst du nicht einbetten.
-
Ja, wenn Du mit dynamisch gelinktem C++ Runtime compilierst (**
/MD
**Option) wird deine EXE-Datei vonMSVCRxxx.DLL
undMSVCPxxx.DLL
abhängen (der genaue Dateiname hängt von deiner MSVC Version ab).Diese kannst Du seit VS2010 aber einfach mit in das Programm-Verzeichnis legen und gut ist. Ansonsten kannst Du natürlich nach wie vor den Redistributable-Installer verwenden, um das passende C++ Runtime auszuliefern.
Alternative kannst Du deine EXE-Datei auch mit statisch gelinktem C++ Runtime compilieren (**
/MT
**Option), dann werden keine C++ Runtime DLL's zur Laufzeit benötigt.Dass der Compiler einer "EXE-Datei wirklich ALLES mitgibt was sie zum Funktionieren benötigt" ist allerdings unmöglich! System DLL's (
Kernel32.dll
, etc), die zum Betribssystem gehören, können nicht statisch gelinkt werden.Wie DarkShadow44 aber schon erwähnt hat: Wenn Du C++/CLI Code mit CLR-Unterstützung (Common Language Runtime) compilierst (d.h. die**
/clr
Option ist gesetzt), dann ist nur noch/MD
erlaubt, d.h. mit/MT
**klappt's nicht.Und natürlich muss in diesem Fall auch zwangsläufig die passende Version des .NET Frameworks auf dem Ziel-System installiert sein, damit Dein Programm dort laufen kann...
BTW: Wenn Du wissen willst, welche DLL's dein Programm tatsächlich zur Laufzeit benötigt, schau einfach in den Dependency Walker. Dann weißt Du Bescheid