54

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

4

9 回答 9

49

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

-static

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

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

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

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

如果您运行带有 added 的链接命令,当您使用and-v时,您应该会看到这些选项出现在 ld/collect2 调用中。-static-libgcc-static-libstdc++

于 2012-12-25T20:08:59.420 回答
33

尝试这个:

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

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

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

于 2015-01-17T15:56:11.773 回答
26

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

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

于 2012-12-25T14:22:17.837 回答
22

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

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

请注意以下事项:

  • 之后应立即禁用“整个存档”选项。
  • 如果您的程序实际上使用库中的符号(即您使用 C++11 中的符号),则不需要执行此 hack <thread>,在这种情况下,当您静态链接库时,库不会被删除。
  • 此 hack 适用于 MinGW-w64,用于修复libwinpthread-1.dll依赖项。
于 2017-04-13T21:52:43.640 回答
7

对于从事 CMake 工作的任何人,此解决方案都可以在您的 CMakeLists.txt 文件中轻松实现,如下所示...

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static")
于 2017-03-23T14:58:44.410 回答
4

显然,CMake 对-Wl编译器标志的处理方式做了一些奇怪的事情,使得-Wl,-Bstatic -lstdc++ -lwinpthread -Wl,-Bdynamic解决方案不起作用,似乎只剩下两个其他选项:坏编译器标志-static和丑陋的编译器标志-Wl,--whole-archive

同时,在 CMake 中实际工作但似乎没有记录的好选择是直接使用链接器标志。因此,在 CMake 中,这似乎是静态链接到所有 mingw-w64 C++ 依赖项的最佳方式:

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

应该注意的是,即使没有明确遵循的库-dynamic,仍应应用它以确保标准的隐式链接库得到正确链接。

于 2018-07-30T21:09:50.203 回答
1

我通过使用 mingw 工具链的 win32 变体而不是 posix 变体绕过了这个问题。使用 win32 变体,-static-libgcc -static-libstdc++对于独立构建来说已经足够了。

于 2020-12-16T18:14:34.343 回答
-1

只需链接-l:libwinpthread.a

于 2021-02-23T18:54:03.653 回答
-2

只需添加-static到您的CFLAGS.

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

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

于 2014-10-22T23:57:46.917 回答