[c++] grote executables met devcpp en gcc

Pagina: 1
Acties:
  • 191 views sinds 30-01-2008
  • Reageer

  • Bob
  • Registratie: Mei 2005
  • Laatst online: 29-04 23:38
(ik ben een complete beginner, dwz ik heb vandaag voor de eerste keer op de compile knop geduwt) :)

Ik vind dat een erg simpel prog als dit
C++:
1
2
3
4
5
6
7
8
9
#include <iostream>

using namespace std;

int main()
{
    cout<<"Joe\n";
    cin.get();
}

Een nogal groot bestand oplevert: 460 KB! Met de compiler optie -s is het nog steeds 260 KB.
Hoe komt dat en wat kan ik er aan doen?

edit: Zoals in de titel vermeld: ik gebruik gcc (zit toch standaard bij devcpp, niet?)

[ Voor 14% gewijzigd door Bob op 01-09-2005 22:26 ]


  • TheBorg
  • Registratie: November 2002
  • Laatst online: 23-04 16:45

TheBorg

Resistance is futile.

Zeker de Microsoft compiler? Is het een console app?

Lezen is een vak.

[ Voor 22% gewijzigd door TheBorg op 01-09-2005 22:25 ]


  • dawuss
  • Registratie: Maart 2001
  • Laatst online: 01-02 20:46

dawuss

gadgeteer

Wat is je host OS? Welke processorarchitectuur? Welk binary format?

Als ik namelijk op Mac OS X (Darwin) met gcc 4.0.0 20041026 dat stukje voorbeeldcode compileer, is het resultaat 17540 bytes groot.

Onder linux met gcc 3.3.5 is het zelfs maar 13425 bytes groot. Dat laatste is in ieder geval met het ELF binary format, als ik me niet vergis :)

offtopic:
wat is devcpp nu eigenlijk?

micheljansen.org
Fulltime Verslaafde Commandline Fetisjist ©


  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

hoe compile je precies?
wat ik bedoel, hoe link je de zooi?

  • Bob
  • Registratie: Mei 2005
  • Laatst online: 29-04 23:38
WinXP Pro
Welke processorarchitectuur?
x86 veronderstel ik (PIII)
Welk binary format?
:?
Als ik namelijk op Mac OS X (Darwin) met gcc 4.0.0 20041026 dat stukje voorbeeldcode compileer, is het resultaat 17540 bytes groot.

Onder linux met gcc 3.3.5 is het zelfs maar 13425 bytes groot. Dat laatste is in ieder geval met het ELF binary format, als ik me niet vergis :)
Ik merk net dat het niet het bestand gcc.exe is dat gebruikt wordt maar g++.exe Is er een groot verschil? opgezocht: I mean When we use gcc for C++ compilation it uses g++ intern.
Welke parameters geef jij mee aan gcc?
offtopic:
wat is devcpp nu eigenlijk?
Dev-C++ is een gratis prog omgeving voor C/C++.
http://www.bloodshed.net/devcpp.html

  • Bob
  • Registratie: Mei 2005
  • Laatst online: 29-04 23:38
Erkens schreef op donderdag 01 september 2005 @ 22:49:
hoe compile je precies?
wat ik bedoel, hoe link je de zooi?
Ik compile door op de knop compile te duwen, met mijn bescheiden kennis denk ik dan dat er gcc zonder veel poespas de code te verwerken krijgt. En wordt er veel gelinkt in zo'n simpel prog? We hebben dit jaar maar erg vaag geleerd wat linken is.

  • dawuss
  • Registratie: Maart 2001
  • Laatst online: 01-02 20:46

dawuss

gadgeteer

http://www.itee.uq.edu.au...d/honoursThesis96/bff.htm
Ik merk net dat het niet het bestand gcc.exe is dat gebruikt wordt maar g++.exe Is er een groot verschil? opgezocht: I mean When we use gcc for C++ compilation it uses g++ intern.
Welke parameters geef jij mee aan gcc?
g++ is het c++ gedeelte van gcc. Dat is normaal.

Ik compile zelf met het volgende commando:
dawuss@persephone:~$ g++ -o test test.cpp


Probeer eens gewoon g++.exe rechtstreeks vanaf de command prompt aan te roepen?

micheljansen.org
Fulltime Verslaafde Commandline Fetisjist ©


Verwijderd

Simpel, je linked met standaard libraries.
Dit is stock code die standaard aan je project wordt gehangen (iig zijn dat je instellingen).
Zonder standaard libraries is je executable een stuk kleiner, maar je heb ook geen beschikking over al die nuttige functies.

*Leest nogmaals* .. oh, -s .. das zonder standard libraries gok ik? }:O

[ Voor 13% gewijzigd door Verwijderd op 01-09-2005 23:00 ]


  • Bob
  • Registratie: Mei 2005
  • Laatst online: 29-04 23:38
dawuss schreef op donderdag 01 september 2005 @ 22:55:
[...]
Probeer eens gewoon g++.exe rechtstreeks vanaf de command prompt aan te roepen?
Weer 462 KB...
Ik ga eens naar een andere versie van cpp zoeken.

  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 10:00
Bob_A schreef op donderdag 01 september 2005 @ 23:01:
[...]

Weer 462 KB...
Ik ga eens naar een andere versie van cpp zoeken.
Je hebt ook djgpp, maar die maakt ook niet veel kleinere executables dan dat je nu hebt.

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett


  • Bob
  • Registratie: Mei 2005
  • Laatst online: 29-04 23:38
Verwijderd schreef op donderdag 01 september 2005 @ 22:59:
Simpel, je linked met standaard libraries.
Dit is stock code die standaard aan je project wordt gehangen (iig zijn dat je instellingen).
Zonder standaard libraries is je executable een stuk kleiner, maar je heb ook geen beschikking over al die nuttige functies.

*Leest nogmaals* .. oh, -s .. das zonder standard libraries gok ik? }:O
-s : Strips symbols from executable (geen idee wat ze bedoelen, het is alleszins kleiner)

Kan ik de linker dan niet zeggen dat ik bvb enkel cout en cin.get interessant vind? (of mssn moet ik gewoon verder gaan met de tutorial...)

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 28-04 18:15

Tomatoman

Fulltime prutser

Even los van de vraag wat er de oorzaak van is, wat is er mis met een executable van 460 kB? 5 jaar geleden was dat nog iets om je druk over te maken, maar inmiddels niet meer.

Een goede grap mag vrienden kosten.


  • Bob
  • Registratie: Mei 2005
  • Laatst online: 29-04 23:38
tomatoman schreef op donderdag 01 september 2005 @ 23:14:
Even los van de vraag wat er de oorzaak van is, wat is er mis met een executable van 460 kB? 5 jaar geleden was dat nog iets om je druk over te maken, maar inmiddels niet meer.
Als het bij iemand anders in 15 KB lukt wil ik dat ook kunnen, en wel van in het begin :)

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 28-04 18:15

Tomatoman

Fulltime prutser

Soms wil het helpen om de functies die je aanroept 1 op 1 te kopiëren naar je source, zodat er niet van alles hoeft te worden meegelinkt.

Ter illustratie console app in Delphi dat 19 kB groot is (ook ik wilde weleens een zo klein mogelijke executable maken :)). Als je dezelfde functies in de standaard units zou gebruiken, zou het resulteren in een executable van ongeveer 450 kB.
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
program execute;

const
  MAX_PATH = 260;
  SW_SHOWNORMAL = 1;
  Caption = 'Execute';
  Msg = 'The command-line tool Execute starts a program or opens a file with its associated program.'#13#13 +
    'Usage:'#13 +
    '   execute <filename> [<parameters>]'#13#13 +
    'If <filename> doesn''t include a path, Execute first searches for it in the current folder and then in the Windows search path.'#13 +
    'Filenames and parameters that contain spaces should be enclosed in double quotes (").'#13#13#13 +
    'Example:'#9#9#9#9#9'Meaning:'#13 +
    '   execute C:\WINDOWS\NOTEPAD.EXE'#9#9'   Start Notepad in the folder C:\WINDOWS.'#13 +
    '   execute notepad'#9#9#9#9'   Start Notepad (find it in the current folder or the search path).'#13 +
    '   execute SomeText.txt'#9#9#9'   Open the file SomeText.txt with its associated program.'#13 +
    '   execute "C:\some name with spaces.txt"'#9'   Open the file  C:\some name with spaces.txt  with its associated program.'#13 +
    '   execute notepad SomeText.txt'#9#9'   Open the file SomeText.txt (in the current folder) with Notepad.'#13 +
    '   execute notepad /p SomeText.txt'#9#9'   Print the file SomeText.txt with Notepad.';

function ShellExecute(hWnd: Integer; Operation, FileName, Parameters,
  Directory: PChar; ShowCmd: Integer): Integer; stdcall;
  external 'shell32.dll' name 'ShellExecuteA';
function MessageBoxA(hWnd: Integer; lpText, lpCaption: PAnsiChar;
  uType: LongWord): Integer; stdcall; external 'user32.dll' name 'MessageBoxA';
function GetFullPathName(lpFileName: PChar; nBufferLength: LongWord;
  lpBuffer: PChar; var lpFilePart: PChar): LongWord; stdcall;
  external 'kernel32.dll' name 'GetFullPathNameA';

function StrLCopy(Dest: PChar; const Source: PChar; MaxLen: Cardinal): PChar;
  assembler;
asm
        PUSH    EDI
        PUSH    ESI
        PUSH    EBX
        MOV     ESI,EAX
        MOV     EDI,EDX
        MOV     EBX,ECX
        XOR     AL,AL
        TEST    ECX,ECX
        JZ      @@1
        REPNE   SCASB
        JNE     @@1
        INC     ECX
@@1:    SUB     EBX,ECX
        MOV     EDI,ESI
        MOV     ESI,EDX
        MOV     EDX,EDI
        MOV     ECX,EBX
        SHR     ECX,2
        REP     MOVSD
        MOV     ECX,EBX
        AND     ECX,3
        REP     MOVSB
        STOSB
        MOV     EAX,EDX
        POP     EBX
        POP     ESI
        POP     EDI
end;

function StrPCopy(Dest: PChar; const Source: string): PChar;
begin
  Result := StrLCopy(Dest, PChar(Source), Length(Source));
end;

function ExpandFileName(const FileName: string): string;
var
  FName: PChar;
  Buffer: array[0..MAX_PATH - 1] of Char;
begin
  SetString(Result, Buffer, GetFullPathName(PChar(FileName), SizeOf(Buffer),
    Buffer, FName));
end;

function ExecuteFile(FileName, Params, DefaultDir: string;
  ShowCmd: Integer): Integer;
var
  zFileName, zParams, zDir: array[0..MAX_PATH -1] of Char;
begin
  Result := ShellExecute(0, nil, StrPCopy(zFileName, FileName),
    StrPCopy(zParams, Params), StrPCopy(zDir, DefaultDir), ShowCmd);
end;

function MessageBox(const Text, Caption: string; const Flags: Longint): Integer;
begin
  Result := MessageBoxA(0, PChar(Text), PChar(Caption), Flags);
end;

var
  CommandLine: string;
begin
  try
    if (ParamCount = 0) or (ParamStr(1) = '/?') then
      MessageBox(Msg, Caption, 0)
    else
    begin
      CommandLine := CmdLine;
      Delete(CommandLine, 1, Length(ParamStr(0)) +1);
      if (Length(CommandLine) > 1) and (CommandLine[1] = '"') then
        Delete(CommandLine, 1, 2);
      Delete(CommandLine, 1, Length(ParamStr(1)) +1);
      if (Length(CommandLine) > 1) and (CommandLine[1] = '"') then
        Delete(CommandLine, 1, 2);
      ExecuteFile(ParamStr(1), CommandLine, '', SW_SHOWNORMAL);
    end;
  except
  end;
end.

Afbeeldingslocatie: http://img323.imageshack.us/img323/1522/execute5hb.gif

[ Voor 7% gewijzigd door Tomatoman op 01-09-2005 23:27 ]

Een goede grap mag vrienden kosten.


  • TheBorg
  • Registratie: November 2002
  • Laatst online: 23-04 16:45

TheBorg

Resistance is futile.

tomatoman schreef op donderdag 01 september 2005 @ 23:14:
Even los van de vraag wat er de oorzaak van is, wat is er mis met een executable van 460 kB? 5 jaar geleden was dat nog iets om je druk over te maken, maar inmiddels niet meer.
Met als gevolg dat alle software tegenwoordig een enorm aantal MB's in beslag neemt en traag is als dikke stront...

Bij mij is het progsel 6275 bytes (g++ 3.2.3 RedHat Enterprise Linux)

[ Voor 6% gewijzigd door TheBorg op 01-09-2005 23:38 ]


  • D4Skunk
  • Registratie: Juni 2003
  • Laatst online: 20-10-2025

D4Skunk

Kind of Blue

Bob_A schreef op donderdag 01 september 2005 @ 23:17:
[...]

Als het bij iemand anders in 15 KB lukt wil ik dat ook kunnen, en wel van in het begin :)
offtopic:
dit zal je misschien wel interesseren dan :)
(Het 4K-intro gedeelte)

  • eamelink
  • Registratie: Juni 2001
  • Niet online

eamelink

Droptikkels

Zit er geen MingW bij DevCPP? Kan je daar niet eens met de commandline opties spelen? Gewoon commandline compilen en wat opties proberen :)

Met G++ 4.0.1 krijg ik met de -s optie de file op 4044 bytes :). Dus dan lijkt me 400 KB inderdaad wel erg veel, een factor 100 :P

  • Bob
  • Registratie: Mei 2005
  • Laatst online: 29-04 23:38
D4Skunk schreef op donderdag 01 september 2005 @ 23:33:
[...]


offtopic:
dit zal je misschien wel interesseren dan :)
(Het 4K-intro gedeelte)
*Gretig aan het lezen*

Deze code uit het artikel is al wat kleiner :)
C:
1
2
3
4
int main(int argc, char *argv[])
{
    return 0;
}

6 KB, dus ik ga rustig verderlezen.

@eamelink: MingW zit erbij, maar geeft een hele hoop errors
http://users.fulladsl.be/spb2357/error.txt

  • JeRa
  • Registratie: Juni 2003
  • Laatst online: 30-04-2025
Why is the compiled executable file so large?
People usually ask this question when they compile a simple program which uses iostreams. The first thing you can do is to add -s to Project Options - Parameters - Linker, but the result may be still too large for your taste. In this case, either try to live with it (it actually doesn't matter so much!), or avoid iostreams (use cstdio), or use another compiler. Also note that there are some exe compressors on the net, e.g. upx.
The reason why iostream increases the size so much is that the linker links entire object files (from inside of libraries) if they contain at least one necessary reference, and the library for iostream is not well separated into small object files. Also, the linker should be able to link only certain sections of the object files (see "--gc-sections"), but this particular feature doesn't work yet on the mingw target (and that affects all libraries and object files).
Hopelijk heb je hier iets aan :) ik had er in mijn executables ook last van, maar door zelf functies te definiëren en niet gebruik te maken van iostream ging mijn app van 400 KB+ terug naar zo'n 30 KB :)

  • Remenic
  • Registratie: Juni 2001
  • Laatst online: 12-12-2025
Zit het probleem hem niet in het feit dat de compiler die bij devc++ zit enkele POSIX libraries statisch meelinkt?

Onder Linux (GCC 3.3.5) is het gecompileerde programma 4,5KB na het strippen.

  • Bob
  • Registratie: Mei 2005
  • Laatst online: 29-04 23:38
Remenic schreef op vrijdag 02 september 2005 @ 00:19:
Zit het probleem hem niet in het feit dat de compiler die bij devc++ zit enkele POSIX libraries statisch meelinkt?

Onder Linux (GCC 3.3.5) is het gecompileerde programma 4,5KB na het strippen.
Ik denk dat het vooral aan iostream ligt, want een prog zonder include iostream is maar 6KB groot.
Ik heb net geprobeerd om wat weg te commenten in iostream, maar dat levert niks op. In modula 2 was dat wel ongeveer de manier om overbodige 'imports' de vermijden. Hoe gaat dat dan in C?

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Hoe het in C gaat is vrij irrelevant, want C heeft geen IOstreams.

De -s optie verwijdert namen uit je programma. Dat maakt debuggen lastiger. De code wordt er echter niet sneller of trager van; de namen worden normaal gesproken toch niet in RAM geladen.

Een verdere mogelijkheid is de "optimize for size" flag. Kijk in je help welke flag dat precies is.

Tenslotte moet je je realiseren dat het niet zo gek belangrijk is hoe groot een klein programma is. De echt belangrijke vraag is hoeveel groter je .exe wordt als je C++ code 100x zo lang wordt. Ik kan je alvast vertellen dat dat geen factor 100 is.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01:02

.oisyn

Moderator Devschuur®

Demotivational Speaker

[google=upx.exe]
Kun je trouwens ook niet gewoon linken tegen een shared/dynamic runtime? Moet je echter wel weer een dll mee distribueren :). Hier hebben linux en MacOS X niet zo'n last van omdat die shared libraries al op het systeem aanwezig zijn.
tomatoman schreef op donderdag 01 september 2005 @ 23:25:
Soms wil het helpen om de functies die je aanroept 1 op 1 te kopiëren naar je source, zodat er niet van alles hoeft te worden meegelinkt.
Kan gcc geen function level linking? En dan nog, vaak zijn functies in aparte sourcefiles gespecificeerd zodat het aparte objects worden en er dus efficienter (als in binary size) gelinkt kan worden - als de linker dus geen function level linking ondersteunt :)

[ Voor 96% gewijzigd door .oisyn op 02-09-2005 10:53 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Bob
  • Registratie: Mei 2005
  • Laatst online: 29-04 23:38
Ik heb het nu met stdio.h gedaan ipv iostream en het resultaat is 5632 bytes groot. Ik zal iostream dan wel in een iets gevorderder stadium leren temmen ;)

Iedereen bedankt voor de hulp, deze topic blijft in m'n bookmarks.

  • igmar
  • Registratie: April 2000
  • Laatst online: 20-04 22:06

igmar

ISO20022

Bob_A schreef op donderdag 01 september 2005 @ 22:23:
(ik ben een complete beginner, dwz ik heb vandaag voor de eerste keer op de compile knop geduwt) :)

Ik vind dat een erg simpel prog als dit
C++:
1
    cout<<"Joe\n";

Een nogal groot bestand oplevert: 460 KB! Met de compiler optie -s is het nog steeds 260 KB.
Hoe komt dat en wat kan ik er aan doen?
Omdat je IO streams gebruikt.

Verwijderd

TheBorg schreef op donderdag 01 september 2005 @ 23:26:
Met als gevolg dat alle software tegenwoordig [..] traag is als dikke stront...
De grootte van een bestand zegt natuurlijk niets over de snelheid.

  • Bob
  • Registratie: Mei 2005
  • Laatst online: 29-04 23:38
Verwijderd schreef op vrijdag 02 september 2005 @ 11:31:
[...]
De grootte van een bestand zegt natuurlijk niets over de snelheid.
Het kan toch handig zijn als een prog in de lvl 1 of 2 cache past? Voor mijn prog is dat uiteraard totaal onbelangrijk...

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01:02

.oisyn

Moderator Devschuur®

Demotivational Speaker

Bob_A: dingen outputten is dan sowieso de bottleneck, of het nou in je cache staat of niet. Snelle inner loops komen in je cache terecht als dat nodig is, en dat is onafhankelijk van de size van je binary. Als je in zo'n snelle inner loop iets wilt outputten is ie per definitie al niet snel meer.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • MisterData
  • Registratie: September 2001
  • Laatst online: 09-04 12:07
Onder VC++ kun je kiezen of je een als runtime-library (RTL) een DLL gebruikt of dat je 'statisch' linked. Dat scheelt ook vaak enorm in de grootte van de executable, maar dan moeten er wel een aantal DLL's aanwezig zijn (msvcr80.dll etc) :)

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

Bob_A schreef op donderdag 01 september 2005 @ 22:23:

C++:
1
2
3
4
5
6
7
8
9
#include <iostream>

using namespace std;

int main()
{
    cout<<"Joe\n";
    cin.get();
}
C++:
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>

using std::cin;
using std::cout;

int main()
{
    cout<<"Joe\n";
    cin.get();
    return 0;
}


zal dit ook niet een iets kleinere executable opleveren ?

normaal zal de linker ervoor zorgen dat enkel de functies die gebruikt worden in de executable zitten, maar je weet nooit...

edit:
460KB is wel HEEL veel...
ik heb een kant-en-klaar statisch gelinkt programma C++/MFC met GUI en alles wat samen amper 350KB is :|

[ Voor 16% gewijzigd door H!GHGuY op 03-09-2005 00:23 ]

ASSUME makes an ASS out of U and ME


  • knopper
  • Registratie: September 2001
  • Laatst online: 25-12-2025

knopper

Sander Knopper

Hier onder Gentoo met gcc-3.3.5 is de gestripte binary 5 kb. In dit geval is het programma dynamisch gelinked met de libraries.

Op het moment dat ik het geheel statisch compileer is het 831 kb.

  • dingstje
  • Registratie: Augustus 2002
  • Laatst online: 02-01-2024
HIGHGuY schreef op zaterdag 03 september 2005 @ 00:22:
[...]


C++:
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>

using std::cin;
using std::cout;

int main()
{
    cout<<"Joe\n";
    cin.get();
    return 0;
}


zal dit ook niet een iets kleinere executable opleveren ?

normaal zal de linker ervoor zorgen dat enkel de functies die gebruikt worden in de executable zitten, maar je weet nooit...

edit:
460KB is wel HEEL veel...
ik heb een kant-en-klaar statisch gelinkt programma C++/MFC met GUI en alles wat samen amper 350KB is :|
Heb het zelf even getest met Dev-C++ en beiden leveren bij mij een executable van 414 kb op.

If you can't beat them, try harder


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01:02

.oisyn

Moderator Devschuur®

Demotivational Speaker

HIGHGuY schreef op zaterdag 03 september 2005 @ 00:22:
[...]


C++:
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>

using std::cin;
using std::cout;

int main()
{
    cout<<"Joe\n";
    cin.get();
    return 0;
}


zal dit ook niet een iets kleinere executable opleveren ?
Natuurlijk niet, het gaat erom wat je aanroept, niet hoe je aan de compiler vertelt van welke plaatsen hij z'n informatie vandaan moet halen. Het is een syntactisch iets, of je nou std::cin gebruikt, using std::cin of using namespace std, als je cin gebruikt gebruik je std::cin, niets meer en niets minder.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1