如何在mingw中执行libwinpthread-1.dll的静态链接?

我从这里使用mingw: 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 : 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

我成功地通过使用-static-libgcc -static-libstdc++参数成功地链接了静态的libstdc++-6.dlllibgcc_s_sjlj-1.dll ,但是我找不到一个和libwinpthread-1.dll一样的命令。

您应该检查GCC的命令行选项文档。

这些没有'-static-something'命令,只有标准库(libgcc和libstdc ++)可以设置为静态链接一个命令。 对于其他库,您首先切换到静态链接与“静态”,然后列出库包含单独的命令,即“-lpthread”。

如果您的工具链包含静态winpthreads,添加选项

 -static 

将拉动所有库的静态版本。

或者,您可以从工具链目录中删除libwinpthread.dll.a和DLL本身。 这可能会搞乱与libstdc ++和libgcc DLL链接的程序,所以要小心。

第三种select是使用-Wl,-Bdynamic-Wl,-Bstatic来select你想链接的版本(当ld被调用时,这是什么-static )。 一个例子:

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

如果使用-v添加运行链接命令,则在使用-static-libgcc-static-libstdc++时,应该会看到在ld / collect2调用中出现这些选项。

尝试这个:

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

-lpthread之前注意-lstdc++ 。 它为我工作。

确保将其添加到g++命令行的最后。

即使在程序中没有使用线程,为了静态链接winpthread ,请将-Bstatic--whole-archiveparameter passing给链接器:

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

请注意以下几点:

  • 之后应立即禁用“整个档案”选项。
  • 如果您的程序实际上使用了库中的符号(即,您使用C ++ 11中的<thread> ),则不需要执行此操作,在这种情况下,静态链接库时不会丢失。
  • 这个黑客是用于MinGW-w64,修复libwinpthread-1.dll的依赖关系。

对于在CMake中工作的人来说,这个解决scheme很容易在CMakeLists.txt文件中实现,如下所示:

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

我有同样的问题。 我正在使用Code :: Blocks,并且通过在链接器命令中添加了一行:

 -lpthread -L libwinpthread-1.dll 

应该在执行其他链接器命令的地方添加此命令,例如:

 -static-libgcc -static-libstdc++ 

执行此命令时,我没有收到编译错误或警告。 第一个指令-lpthread指定头文件,尾指令-L用于链接特定文件。

我正在使用gcc版本4.8.1。 这个更高版本包含* to_string *的错误修正,例如我需要的。

只需在您的CFLAGS添加-static

例如: ./configure CFLAGS="-static"

这将把所有的静态库链接到你的可执行文件。