Search code examples
c++cygwinstatic-linkingmingw-w64

MinGW, how to avoid linking statically full libstdc++


I am using mingw 64 bit with cygwin.

I know that if I compile using

x86_64-w64-mingw32-g++.exe -std=c++11 hello.cpp

the output .exe does not run unless the library path to libstdc++ and other libraries is specified in the Path environment variable.

An alternative is to link statically

x86_64-w64-mingw32-g++.exe -std=c++11 hello.cpp -static-libgcc -Wl,-Bstatic -lstdc++ -lpthread

Since I want a single .exe that I can easily copy on different machines, the second solution is better for me. My only problem is that, since I link statically, even for a simple helloworld program, the size of the executable rises to more than 10 Mb. So my question is: is it possible to link statically only the library parts that are actually used by the program?


Solution

  • The binutils linker on Windows, ld, does not support the --gc-sections argument properly, which in combination with compiler flags -ffunction-sections and -fdata-sections, allow the linker to throw away blocks of unused code.

    You are straight out of luck. The only thing you can do is the usual: strip the executable (by running the strip command on it after it is linked) and compile your code optimising for size with -Os.


    Keeping in mind these options do not work on Windows (which for the purpose of this answer, includes the Cygwin platform), this is generally how you can do this:

    g++ -c -Os -ffunction-sections -fdata-sections some_file.cpp -o some_file.o
    g++ -c -Os -ffunction-sections -fdata-sections main.cpp -o main.o
    g++ -Wl,--gc-sections main.o some_file.p -o my_executable