5

「Win32 用の pthreads」を MinGW32 でコンパイルされたアプリケーションに静的にリンクしたいので、アプリケーションを実行するために pthreadGC2.dll は必要ありません。

ここからダウンロードした pthreads の最新リリース 2.9.1 を使用しています。libおよび include ファイルは MinGW の lib および include ディレクトリにコピーされます。

その方法を Web で検索すると、 -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-dl​​l.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");
}

そして私のメイクファイル:

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
4

1 に答える 1