我从这里使用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>
答案 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
请注意以下事项:
<thread>
),则不需要执行此操作,在这种情况下,库不会获得当你静态链接它时丢弃。答案 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 *的错误修复,例如我需要的。