Exe wird zu groß...
-
wenn die echse zu groß wird, weniger füttern!
-
rüdiger schrieb:
Die C Runtime wird unter Windows/DOS statisch gelinkt. Daher hast du immer einen festen Overhead. Du kannst natürlich versuchen eine kleinere Standard Bib zu bekommen, so was wie die diet libc (gibt es aber nur für Windows).
(-Os -s -fomit-frame-pointer als Compile-Optionen sollte ein bisschen helfen)
Wie gesagt: MSVC8 linkt auch dynamisch (sogar per default!). Dann ist ein Helloworld nur 9 KByte klein.
-
Artchi schrieb:
rüdiger schrieb:
Die C Runtime wird unter Windows/DOS statisch gelinkt. Daher hast du immer einen festen Overhead. Du kannst natürlich versuchen eine kleinere Standard Bib zu bekommen, so was wie die diet libc (gibt es aber nur für Windows).
(-Os -s -fomit-frame-pointer als Compile-Optionen sollte ein bisschen helfen)
Wie gesagt: MSVC8 linkt auch dynamisch (sogar per default!). Dann ist ein Helloworld nur 9 KByte klein.
Nee, weil du ja noch die DLL brauchst...
-
Eben! dynamisch bedeutet DLL. Nur das die DLL meistens schon auf dem Windows-System installiert ist. Wenn nicht (in der gewünschten Version, eine ist aber mind. immer drauf), kann man ein offizielles entsprechendes C-Runtime-Archiv von der MS-Website downloaden (einmal für alle nutzenden Programme und gut ist).
-
Wenn Du eine kleine EXE willst, dann:
- verwendet niemals die STL
- verwende keine MFC/ATLwenn Du sie dann noch kleiner haben willst, dann
- verwende niemals die CRT!Damit bekommst Du 2048 Bytes (kleiner geht es nicht; siehe PE-Format):
#include <windows.h> #include <tchar.h> #pragma comment(linker, "/entry:entry") void entry() { TCHAR szText[] = _T("Hello world\n"); DWORD dwWritten; WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), szText, lstrlen(szText), &dwWritten, NULL); }
Compilieren mit:
cl /c /O1 /GS- CPP_VS2005.cpp
und linken mit:
link /subsystem:console CPP_VS2005.obj kernel32.lib
Dies ergibt dann im PE:
Microsoft (R) COFF/PE Dumper Version 8.00.50727.762 Copyright (C) Microsoft Corporation. All rights reserved. Dump of file CPP_VS2005.exe PE signature found File Type: EXECUTABLE IMAGE FILE HEADER VALUES 14C machine (x86) 2 number of sections 4694EBC1 time date stamp Wed Jul 11 16:40:01 2007 0 file pointer to symbol table 0 number of symbols E0 size of optional header 103 characteristics Relocations stripped Executable 32 bit word machine OPTIONAL HEADER VALUES 10B magic # (PE32) 8.00 linker version 200 size of code 200 size of initialized data 0 size of uninitialized data 1000 entry point (00401000) 1000 base of code 2000 base of data 400000 image base (00400000 to 00402FFF) 1000 section alignment 200 file alignment 4.00 operating system version 0.00 image version 4.00 subsystem version 0 Win32 version 3000 size of image 400 size of headers 0 checksum 3 subsystem (Windows CUI) 400 DLL characteristics No structured exception handler 100000 size of stack reserve 1000 size of stack commit 100000 size of heap reserve 1000 size of heap commit 0 loader flags 10 number of directories 0 [ 0] RVA [size] of Export Directory 2020 [ 28] RVA [size] of Import Directory 0 [ 0] RVA [size] of Resource Directory 0 [ 0] RVA [size] of Exception Directory 0 [ 0] RVA [size] of Certificates Directory 0 [ 0] RVA [size] of Base Relocation Directory 0 [ 0] RVA [size] of Debug Directory 0 [ 0] RVA [size] of Architecture Directory 0 [ 0] RVA [size] of Global Pointer Directory 0 [ 0] RVA [size] of Thread Storage Directory 0 [ 0] RVA [size] of Load Configuration Directory 0 [ 0] RVA [size] of Bound Import Directory 2000 [ 10] RVA [size] of Import Address Table Directory 0 [ 0] RVA [size] of Delay Import Directory 0 [ 0] RVA [size] of COM Descriptor Directory 0 [ 0] RVA [size] of Reserved Directory SECTION HEADER #1 .text name 3C virtual size 1000 virtual address (00401000 to 0040103B) 200 size of raw data 400 file pointer to raw data (00000400 to 000005FF) 0 file pointer to relocation table 0 file pointer to line numbers 0 number of relocations 0 number of line numbers 60000020 flags Code Execute Read RAW DATA #1 00401000: 55 8B EC 83 EC 14 56 57 BE 10 20 40 00 8D 7D EC U.ì.ì.VW¾. @..}ì 00401010: A5 A5 6A 00 8D 45 FC A5 50 8D 45 EC 50 A4 FF 15 ¥¥j..Eü¥P.EìP¤ÿ. 00401020: 04 20 40 00 50 8D 45 EC 50 6A F5 FF 15 00 20 40 . @.P.EìPjõÿ.. @ 00401030: 00 50 FF 15 08 20 40 00 5F 5E C9 C3 .Pÿ.. @._^Éà SECTION HEADER #2 .rdata name 92 virtual size 2000 virtual address (00402000 to 00402091) 200 size of raw data 600 file pointer to raw data (00000600 to 000007FF) 0 file pointer to relocation table 0 file pointer to line numbers 0 number of relocations 0 number of line numbers 40000040 flags Initialized Data Read Only RAW DATA #2 00402000: 68 20 00 00 78 20 00 00 58 20 00 00 00 00 00 00 h ..x ..X ...... 00402010: 48 65 6C 6C 6F 20 77 6F 72 6C 64 0A 00 00 00 00 Hello world..... 00402020: 48 20 00 00 00 00 00 00 00 00 00 00 84 20 00 00 H ........... .. 00402030: 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 . .............. 00402040: 00 00 00 00 00 00 00 00 68 20 00 00 78 20 00 00 ........h ..x .. 00402050: 58 20 00 00 00 00 00 00 99 03 57 72 69 74 65 43 X ........WriteC 00402060: 6F 6E 73 6F 6C 65 41 00 B9 01 47 65 74 53 74 64 onsoleA.¹.GetStd 00402070: 48 61 6E 64 6C 65 00 00 CC 03 6C 73 74 72 6C 65 Handle..Ì.lstrle 00402080: 6E 41 00 00 4B 45 52 4E 45 4C 33 32 2E 64 6C 6C nA..KERNEL32.dll 00402090: 00 00 .. Section contains the following imports: KERNEL32.dll 402000 Import Address Table 402048 Import Name Table 0 time date stamp 0 Index of first forwarder reference 1B9 GetStdHandle 3CC lstrlenA 399 WriteConsoleA Summary 1000 .rdata 1000 .text
-
es gibt auch bei g++ die möglichkeit dem copilier zu sagen, dass er auf größe optimieren soll. Wenn man die Passende IDE hat, dann kann man sich die ganzen kompilierflags komfortabe ansehen und (de)aktivieren. Der grund für die riesigen exe Dateien sind immer die bibliotheken. Templates und inlinefunktionen können auch stark die die Größe beeinträchtigen, genau wie Makros, aber die hast du ja nicht verwendet.
-
Wusste nicht, das du für Dos programmieren willst.
Der Compiler hier kann auch 16 Bit, mit den DOS 16 libraries:
http://www.digitalmars.com/download/freecompiler.htmlWie gross die exe werden, keine Ahnung.
-
ich hab mir mal ein "Hallo Welt"-Programm mit cout geschrieben, und das durch den g++ mit dem compilerflag -Os (auf größe optimieren) laufen lassen, das Ergebnis ist 8338 bytes groß. Also -Os bringt auf jeden Fall etwas, und printf ist da nicht unbedingt besser.
-
@Krux
häng auch noch mal -s an, das entfernt alle nutzlosen Symbole und Debug-Infos und -fomit-frame-pointer sollte den Code auch noch mal kleiner machen.Artchi schrieb:
Eben! dynamisch bedeutet DLL. Nur das die DLL meistens schon auf dem Windows-System installiert ist. Wenn nicht (in der gewünschten Version, eine ist aber mind. immer drauf), kann man ein offizielles entsprechendes C-Runtime-Archiv von der MS-Website downloaden (einmal für alle nutzenden Programme und gut ist).
Bringt ihm unter DOS aber immer noch recht wenig
Und am Ende würde man wohl doch lieber statisch linken, wenn man das Binary weiter geben will.
-
So ich hab nun auch nochmal mit gcc und den Zusatzoptionen probiert. Half alles nichts.
Ich hab nun in meiner Verzweiflung mir den alten Borland C++ 3.0 mit 9 Disketteninstalliert. Das "Hallo Welt" hat nun auch nur 8kb. Aber danke euch allen für die Tipps.