23
votes

I have a trivial "Hello world" C++ program that is compiled to 500kB executable by MinGW g++ compiler under Win XP. Some say that is caused by iostream library and static link of libstdc++.dll.

Using -s linker option helped a bit (reducing 50% size), but I would by satisfied only by <10kB executable. Is there any way how to achieve this using MinGW compiler? Portability is not a big concern for me.

Is it possible to copy libstdc++.dll with the executable using dynamic linking? If so, how to achieve this?


Solved: I was using MinGW 3.4. Now I updated to latest MinGW 4.6 and the size was decreased by 90% to 50kB, with -s option even to 9kB, which is fully sufficient. Anyway - thanks everyone for help. Here you go my results

C++ Hello World program using iostream

MinGW | no options | -s option
------------------------------
3.4   | 500kB      | 286 kB
4.6   | 50kB       |   9 kB
4
Use -shared-libstdc++ to compile and dynamically link against libstdc++.dll, and -Os to optimize the binary for size.wkl
Although it's un-C++-like, you could try printf(). I'm not sure how much of the same dependencies it shares with the iostream library. So it may or may not make it any smaller.Mysticial
@birryree: g++: error: unrecognized option '-shared-libstdc++' using MinGW 4.6Jan Turoň
@Jan - Yeah I think in GCC 4.6, your generated binaries fall in line with the normal size expected with a shared libstdc++ - on Linux with GCC 4.6 a simple 'hello world' app is 8 KB for me. MinGW's GCC 3.4 generated sizes are that large since there was no concept of shared libstdc++ yet.wkl
Under later versions of MinGW where standard libraries are linked dynamically, the static linking of standard libraries can be forced with -static-libgcc (C) or -static-libstdc++ (C++) options.Jan Turoň

4 Answers

15
votes

Flags to use:

  • -s like you've been doing to strip symbols
  • -lstdc++_s to specify dynamically linking against the libstdc++.dll
  • -Os to optimize the binary for size.

By default mingw static links to libstdc++.a on Windows.

Note that the lstdc++_s flag is only in MinGW with GCC > 4.4, I believe.

8
votes
2
votes

Using the -Os flag might help. That optimizes for size.

0
votes

You should be using -O for optimization. Add "-O{level}" to your compiler args and it will optimize for either speed or size. Check the docs for your compiler.

You could also have debugging symbols enabled. Stripping those will also make it smaller.