Search code examples
c++dllmingw

MinGW .exe requires a few gcc dll's regardless of the code?


When compiling with MinGW, I have to copy over certain dll files from the MinGW bin directory before the exe will run (Even when using "-static" and/or "-static-libstdc++".) How do I change that? Is there a special build of MinGW that I have to use? Ultimately I want to be able to run the program with nothing but the exe in the directory (and no windows environment variables set.) These File's are:

  • libstdc++-6.dll
  • libgcc_s_seh-1.dll
  • libwinpthread-1.dll

And here is the complete list of step's I fallow:

  1. Open Up Code::Blocks
  2. Select "File->New->Project->Console"
  3. Fill out the project settings for project "Hello World"
  4. Right click Project->Build Options...->Hello World (Root target)->Other Options
  5. Enter "-static" (or "-static-libstdc++") under the already set "-fexceptions"
  6. CTRL-F9 : Build Project (Without executing)
  7. Navigate to, in Windows Explorer, and run the built "Hello World.exe" file.
  8. Click "OK" when a message pop's up saying "Error: libstdc++-6.dll is missing from your computer."
  9. Copy "libstdc++-6.dll" from the /MinGW/bin/ directory, into the "Hello World.exe" directory.
  10. Run "Hello World.exe"
  11. Click "OK" for the message saying "Error: libgcc_s_seh-1.dll is missing from your computer."
  12. Copy "libgcc_s_seh-1.dll" into the "Hello World.exe" directory.
  13. Repeat and end up copying "libwinpthread-1.dll" over aswell.
  14. View the message

    Hello World!
    

Edit: My command line is:

g++.exe -Wall -fexceptions -static -static-libgcc -static-libstdc++ -g -static-libgcc -static-libstdc++ -L. -c "C:\Users\______\Desktop\Hello World\main.cpp" -o obj\Debug\main.o
g++.exe -o "bin\Debug\Hello World.exe" obj\Debug\main.o

With all the dll files mentioned above required. And, just to be safe, the code is:

// main.cpp
#include <iostream>

using namespace std;

int main()
{
    cout << "Hello world!" << endl;
    return 0;
}

Solution

  • Your commands are wrong !

    Go to the directory where your main.cpp file is, and try the following.

    g++.exe -Wall -c -g main.cpp -o obj\Debug\main.o
    g++.exe -static -static-libgcc -static-libstdc++ -o "bin\Debug\Hello World.exe" obj\Debug\main.o
    

    then you'll no longer need to copy the DLLs (for your Hello World program).

    Other notes:

    The MinGW installation instructions recommends setting

    c:\minGW;c:\MinGW\bin;
    

    to the PATH environment variable.

    Normally the

    -static -static-libgcc -static-libstdc++
    

    linker options should work (try all 3 of them at once). But not for libwinpthread-1.dll.

    Also, try to clean before recompiling.

    There's no "-static-something" command.

    Only standard libraries libgcc and libstdc++ can be set to static linking.

    For other libraries, you first switch to static linking with "-static" and then list the libraries to include with separate commands, i.e. "-lpthread".

    Cmake users should try adding:

    set(CMAKE_CXX_STANDARD_LIBRARIES "-static-libgcc -static-libstdc++ -lwsock32 -lws2_32 ${CMAKE_CXX_STANDARD_LIBRARIES}")
    
    set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-Bstatic,--whole-archive -lwinpthread -Wl,--no-whole-archive")
    

    **libraries **

    Note that if you are building your own cpp libraries to use/link against (ex: libXX.a files), they must be compiled with the same -static-* options as you use for your main program, otherwise it will crash.