pthreads статическое связывание с MinGW

Я хотел бы статически связать "pthreads для Win32" с моим приложением, скомпилированным с MinGW32, чтобы приложение не нуждалось в pthreadGC2.dll для запуска.

Я использую последнюю версию pthreads - 2.9.1, скачанную отсюда и lib, и включаемые файлы копируются в MinGW lib и включают в себя каталоги.

При поиске в Интернете, как это сделать, я наткнулся на этот поток, который инструктирует использование флагов -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'

Кто-нибудь знает, как это сделать?

Кстати, копирование файла pthreadGC2.dll, загруженного из выпуска 2.9.1 (внутри pthreads-w32-2.9.1-1-mingw32-dll.tar.lzma), в папку приложения недостаточно. Для запуска приложения я должен также скопировать другую 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");
}

и мой make-файл:

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

1 ответ

Решение

В новой обновленной версии MinGW вы можете получить версию 2.10 библиотеки pthread-win32. Среди нескольких изменений и исправлений ошибок вы можете найти возможность статически связать его. Вам нужно только включить -lpthread в список статических библиотек.

Ниже приведен пример смешивания статических ссылок с библиотекой pthread и динамических ссылок с библиотекой Windows:

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

При этом вы также освобождаете зависимость от libgcc_s_dw2-1.dll

Другие вопросы по тегам