我用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
。
你或许应该检查命令行选项文档GCC。
这些没有“-static-东西”命令,唯一的标准库(libgcc中和libstdc ++)可以设置为静态的,其中一个命令链接。 对于其它库,你先切换到与“-static”,然后静态链接库列表与单独的命令,包括,即“-lpthread”。
如果您的工具链包括静态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
如果你运行你的链接命令-v
增加,你应该看到出现在LD / collect2调用这些选项时使用-static-libgcc
和-static-libstdc++
。
试试这个:
-static-libgcc -static-libstdc++ -Wl,-Bstatic -lstdc++ -lpthread -Wl,-Bdynamic
注意-lstdc++
之前-lpthread
。 它为我工作。
确保添加到您的尽头g++
命令行。
静态链接winpthread即使线程没有在程序中使用,通过-Bstatic
和--whole-archive
参数的链接:
g++ -o hello.exe hello.cpp -Wl,-Bstatic,--whole-archive -lwinpthread -Wl,--no-whole-archive
请注意以下几点:
- “整档案”选项应随即被禁用。
- 你并不需要,如果你的程序实际上从库使用符号来做到这一点的黑客(即您使用
<thread>
从C ++ 11),在这种情况下,当你静态链接它的库将不会下降。 - 这个技巧是为MinGW的-W64,修复libwinpthread-1.DLL依赖。
对于任何人在CMake的工作,该解决方案在您的CMakeLists.txt文件很容易实现如下...
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static")
显然,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
,它仍然应该按顺序应用,保证了标准,隐含链接库得到正确链接。
只需添加-static
到您的CFLAGS
。
例如: ./configure CFLAGS="-static"
。
这都将静态库链接到你的可执行文件。
我有同样的问题。 我使用的代码::块,而我通过添加链接commmands额外的行取得了成功:
-lpthread -L libwinpthread-1.dll
这个命令应该加入哪个位置执行其他命令的链接,如:
-static-libgcc
-static-libstdc++
执行此命令时,我收到没有编译错误或警告。 第一指令,-lpthread,指定的头文件,和后指令,-L,用于链接一个特定的文件。
我使用gcc版本4.8.1。 这个新版本包含了* to_string * bug修复,比如我需要的。