如何在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.dll
和libgcc_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-archive
parameter 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"
。
这将把所有的静态库链接到你的可执行文件。