how to do static linking of libwinpthread-1.dll in mingw?

C++MingwStatic Linking

C++ Problem Overview


I use mingw from here: http://sourceforge.net/projects/mingwbuilds/files/host-windows/releases/4.7.2/32-bit/threads-posix/sjlj/x32-4.7.2-release-posix-sjlj-rev2.7z/download

And I've sucessfully managed to link statically libstdc++-6.dll and libgcc_s_sjlj-1.dll by using -static-libgcc -static-libstdc++ parameters, but I cannot find a command for doing the same with libwinpthread-1.dll.

C++ Solutions


Solution 1 - C++

If your toolchain includes the static winpthreads, adding the option

-static

Will pull in static versions of all libraries it can.

Alternatively, you can remove libwinpthread.dll.a and the DLL itself from the toolchain directories. This might mess up programs linking with libstdc++ and libgcc DLLs though, so be careful.

A third option is to use -Wl,-Bdynamic and -Wl,-Bstatic to select which version you want linked in (which is what -static internally does when ld is called). An example:

gcc -o someexec someobject.o -Wl,-Bdynamic -lsomelibIwantshared -Wl,-Bstatic -lsomelibIwantstatic

If you run your link command with -v added, you should see these options appearing in the ld/collect2 invocation when you use -static-libgcc and -static-libstdc++.

Solution 2 - C++

Try this:

-static-libgcc -static-libstdc++ -Wl,-Bstatic -lstdc++ -lpthread -Wl,-Bdynamic

Notice the -lstdc++ before -lpthread. It worked for me.

Make sure to add this to the very end of your g++ command line.

Solution 3 - C++

You should probably check command line options documentation for GCC.

These's no '-static-something' command, only standard libraries (libgcc and libstdc++) can be set to static linking with one command. For other libraries, you first switch to static linking with "-static" and then list the libraries to include with separate commands, ie "-lpthread".

Solution 4 - C++

To statically link winpthread even if threading isn't used in the program, pass the -Bstatic and --whole-archive parameters to the linker:

g++ -o hello.exe hello.cpp -Wl,-Bstatic,--whole-archive -lwinpthread -Wl,--no-whole-archive

Note the following:

  • The "whole archive" option should be disabled immediately afterwards.
  • You don't need to do this hack if your program actually uses symbols from the library (i.e. you use <thread> from C++11), in which case the library won't get dropped when you statically link it.
  • This hack is intended for MinGW-w64, to fix the libwinpthread-1.dll dependencies.

Solution 5 - C++

For anyone working in CMake, this solution is readily implemented in your CMakeLists.txt file as follows...

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static")

Solution 6 - C++

Apparently, CMake does some weird stuff with how the -Wl compiler flags are handled, making the -Wl,-Bstatic -lstdc++ -lwinpthread -Wl,-Bdynamic solution not work, with only two other options seemingly left: the bad compiler flag -static and the ugly compiler flag -Wl,--whole-archive.

Meanwhile, the good option that actually works in CMake, yet seems rather undocumented, is to directly use the linker flags. Hence, in CMake, this seems to be the best way to statically link to all the mingw-w64 C++ dependencies:

target_link_libraries (MyVeryAwesomeApp -static gcc stdc++ winpthread -dynamic)

It should be noted that even if there isn't a library explicitly following -dynamic, it should still be applied in order to ensure that the standard, implicitly linked libraries get linked correctly.

Solution 7 - C++

I circumvented this problem by using win32 variant of the mingw toolchain instead of the posix variant. With the win32 variant, -static-libgcc -static-libstdc++ is sufficient for an independent build.

Solution 8 - C++

Just link with -l:libwinpthread.a

Solution 9 - C++

Just add -static to your CFLAGS.

For example: ./configure CFLAGS="-static".

This will link all static libraries to your executable file.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionrsk82View Question on Stackoverflow
Solution 1 - C++rubenvbView Answer on Stackoverflow
Solution 2 - C++Star BrilliantView Answer on Stackoverflow
Solution 3 - C++Tomasz LisView Answer on Stackoverflow
Solution 4 - C++user7023624View Answer on Stackoverflow
Solution 5 - C++SyndogView Answer on Stackoverflow
Solution 6 - C++S. Exchange Considered HarmfulView Answer on Stackoverflow
Solution 7 - C++HermannView Answer on Stackoverflow
Solution 8 - C++superbemView Answer on Stackoverflow
Solution 9 - C++NeobryView Answer on Stackoverflow