pthreads与MinGW的静态链接

时间:2016-08-29 22:04:27

标签: windows dll static-linking mingw32 pthreads-win32

我想将“pthreads for Win32”静态链接到我的应用程序,使用MinGW32编译,因此应用程序不需要运行pthreadGC2.dll。

我正在使用最新版本的pthreads - 2.9.1,从Protobuf-net: the unofficial manual: Forms of type serialization in protobuf-net下载,lib和include文件被复制到MinGW lib并包含目录。

在网上搜索如何做到这一点时,我偶然发现here指示使用-static-libgcc -static-libstdc ++标志。这不起作用,意味着应用程序编译但是如果没有pthreadGC2.dll存在则无法运行。

他们还建议使用-static -static-libgcc -static-libstdc ++。这不会编译时出现以下错误:

#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");
}

有谁知道怎么做?

顺便说一句 - 将从2.9.1版本(在pthreads-w32-2.9.1-1-mingw32-dl​​l.tar.lzma内部)下载的pthreadGC2.dll复制到应用程序的文件夹是不够的。要运行应用程序,我还应该复制另一个DLL:libgcc_s_dw2-1.dll。这对我来说真的很糟糕 - 我不想让我的用户每次想要运行我的应用程序时都有这两个DLL

这是我的代码:

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

和我的makefile:

<ScrollView>
    ...
    <ListView ... renderRow={ (rowData) => return (
        <SomeCustomComponent> {rowData} </SomeCustomComponent>
    )}/>
</ScrollView>

1 个答案:

答案 0 :(得分:2)

使用MinGW的新更新版本,您可以获得pthread-win32库的2.10版本。在几个更改和错误修复中,您可以找到静态链接它的可能性。 您只需要在静态库列表中包含-lpthread。

以下是将静态链接与pthread库混合并将dinamic链接到Windows库的示例:

mingw32-gcc.exe -o sample.exe sample.c -Wl,-Bstatic -lpthread -Wl,-Bdynamic -lws2_32

这样,您还可以释放对libgcc_s_dw2-1.dll的依赖