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 Library

    Fü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 von MSVCRxxx.DLL und MSVCPxxx.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 😉


Log in to reply