pthreads 与 MinGW 的静态链接
pthreads static linking with MinGW
我想用我的应用程序静态 link "pthreads for Win32",用 MinGW32 编译,所以应用程序不需要 pthreadGC2.dll 到 运行。
我正在使用最新版本的 pthreads - 2.9.1,从 here 下载,并将 lib 和包含文件复制到 MinGW lib 和包含目录。
在网上搜索如何操作时,我偶然发现了 this thread,它指示使用 -static-libgcc -static-libstdc++ 标志。这不起作用,这意味着该应用程序可以编译,但如果没有 pthreadGC2.dll,它就无法 运行。
他们还推荐使用 -static -static-libgcc -static-libstdc++。这不会编译并出现以下错误:
main.o:main.cpp:(.text+0x461): undefined reference to `_imp__pthread_create'
main.o:main.cpp:(.text+0x4be): undefined reference to `_imp__pthread_join'
有人知道怎么做吗?
顺便说一句 - 将从 2.9.1 版本(在 pthreads-w32-2.9.1-1-mingw32-dll.tar.lzma 中)下载的 pthreadGC2.dll 复制到应用程序的文件夹是不够的。对于 运行 应用程序,我还应该复制另一个 dll:libgcc_s_dw2-1.dll。这对我来说真的很糟糕 - 我不想让我的用户每次想要 运行 我的应用程序
时都拥有这 2 个 DLL
这是我的代码:
#include <stdio.h>
#include <pthread.h>
static void* threadMain(void* param)
{
printf("thread start\n");
for (int i = 0; i < 2; i++)
Sleep(1);
printf("thread end\n");
return NULL;
}
int main(int argc, char* argv[])
{
pthread_t thread;
int err = pthread_create(&thread, NULL, threadMain, NULL);
if (err != 0)
{
printf("Cannot create thread: %s", strerror(err));
return;
}
printf("thread created\n");
Sleep(1);
pthread_join(thread, NULL);
printf("thread joined\n");
}
和我的 makefile:
all:
g++.exe -DHAVE_STRUCT_TIMESPEC -c -o main.o main.cpp
g++.exe -static-libgcc -static-libstdc++ -o link_pthreads.exe main.o -lpthread
clean:
del main.o
del link_pthreads.exe
使用新更新的 MinGW 版本,您可以获得 pthread-win32 库的 2.10 版。在几个更改和错误修复中,您可以找到静态 link 它的可能性。
您只需要在静态库列表中包含 -lpthread。
以下是将静态 linking 与 pthread 库混合以及动态 linking 与 Windows 库混合的示例:
mingw32-gcc.exe -o sample.exe sample.c -Wl,-Bstatic -lpthread -Wl,-Bdynamic -lws2_32
这样,你也解除了对libgcc_s_dw2-1.dll
的依赖
我想用我的应用程序静态 link "pthreads for Win32",用 MinGW32 编译,所以应用程序不需要 pthreadGC2.dll 到 运行。
我正在使用最新版本的 pthreads - 2.9.1,从 here 下载,并将 lib 和包含文件复制到 MinGW lib 和包含目录。
在网上搜索如何操作时,我偶然发现了 this thread,它指示使用 -static-libgcc -static-libstdc++ 标志。这不起作用,这意味着该应用程序可以编译,但如果没有 pthreadGC2.dll,它就无法 运行。
他们还推荐使用 -static -static-libgcc -static-libstdc++。这不会编译并出现以下错误:
main.o:main.cpp:(.text+0x461): undefined reference to `_imp__pthread_create'
main.o:main.cpp:(.text+0x4be): undefined reference to `_imp__pthread_join'
有人知道怎么做吗?
顺便说一句 - 将从 2.9.1 版本(在 pthreads-w32-2.9.1-1-mingw32-dll.tar.lzma 中)下载的 pthreadGC2.dll 复制到应用程序的文件夹是不够的。对于 运行 应用程序,我还应该复制另一个 dll:libgcc_s_dw2-1.dll。这对我来说真的很糟糕 - 我不想让我的用户每次想要 运行 我的应用程序
时都拥有这 2 个 DLL这是我的代码:
#include <stdio.h>
#include <pthread.h>
static void* threadMain(void* param)
{
printf("thread start\n");
for (int i = 0; i < 2; i++)
Sleep(1);
printf("thread end\n");
return NULL;
}
int main(int argc, char* argv[])
{
pthread_t thread;
int err = pthread_create(&thread, NULL, threadMain, NULL);
if (err != 0)
{
printf("Cannot create thread: %s", strerror(err));
return;
}
printf("thread created\n");
Sleep(1);
pthread_join(thread, NULL);
printf("thread joined\n");
}
和我的 makefile:
all:
g++.exe -DHAVE_STRUCT_TIMESPEC -c -o main.o main.cpp
g++.exe -static-libgcc -static-libstdc++ -o link_pthreads.exe main.o -lpthread
clean:
del main.o
del link_pthreads.exe
使用新更新的 MinGW 版本,您可以获得 pthread-win32 库的 2.10 版。在几个更改和错误修复中,您可以找到静态 link 它的可能性。 您只需要在静态库列表中包含 -lpthread。
以下是将静态 linking 与 pthread 库混合以及动态 linking 与 Windows 库混合的示例:
mingw32-gcc.exe -o sample.exe sample.c -Wl,-Bstatic -lpthread -Wl,-Bdynamic -lws2_32
这样,你也解除了对libgcc_s_dw2-1.dll
的依赖