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

时间:2012-12-07 18:00:52

标签: c++ mingw static-linking

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

我已成功设法通过使用libstdc++-6.dll参数静态链接libgcc_s_sjlj-1.dll-static-libgcc -static-libstdc++,但我找不到使用libwinpthread-1.dll执行相同操作的命令。< / p>

10 个答案:

答案 0 :(得分:42)

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

-static

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

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

第三个选项是使用-Wl,-Bdynamic-Wl,-Bstatic来选择要链接的版本(调用ld时内部-static内部执行的操作)。一个例子:

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

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

答案 1 :(得分:25)

试试这个:

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

请注意-lstdc++之前的-lpthread。它对我有用。

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

答案 2 :(得分:20)

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

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

答案 3 :(得分:13)

要静态链接 winpthread ,即使程序中未使用线程,也请将-Bstatic--whole-archive参数传递给链接器:

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

请注意以下事项:

  • &#34;整个档案&#34;之后应立即禁用该选项。
  • 如果您的程序实际使用了库中的符号(即您使用C ++ 11中的<thread>),则不需要执行此操作,在这种情况下,库不会获得当你静态链接它时丢弃。
  • 此hack适用于MinGW-w64,用于修复 libwinpthread-1.dll 依赖项。

答案 4 :(得分:3)

对于在CMake工作的任何人,此解决方案很容易在您的CMakeLists.txt文件中实现,如下所示......

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

答案 5 :(得分:0)

很显然,CMake在处理-Wl编译器标志的方式上做了一些奇怪的事情,使得-Wl,-Bstatic -lstdc++ -lwinpthread -Wl,-Bdynamic解决方案不起作用,似乎只剩下了两个选择:错误的编译器标志{{1} }和丑陋的编译器标志-static

与此同时,实际上在CMake中有效的好选项(似乎没有记载)是直接使用链接器标志。因此,在CMake中,这似乎是静态链接到所有mingw-w64 C ++依赖项的最佳方法:

-Wl,--whole-archive

应注意,即使没有target_link_libraries (MyVeryAwesomeApp -static gcc stdc++ winpthread -dynamic) 后面明确地包含一个库,也应该应用它,以确保标准的,隐式链接的库正确链接。

答案 6 :(得分:0)

我通过使用mingw工具链的win32变体而不是posix变体来解决此问题。对于win32变体,-static-libgcc -static-libstdc++对于独立构建就足够了。

答案 7 :(得分:-1)

只需与 -l:libwinpthread.a 链接

答案 8 :(得分:-2)

只需将-static添加到CFLAGS

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

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

答案 9 :(得分:-3)

我遇到了同样的问题。我正在使用Code :: Blocks,我通过在链接器命令中添加一行来获得成功:

-lpthread -L libwinpthread-1.dll

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

-static-libgcc
-static-libstdc++

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

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