2016-08-29 2 views
1

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

Я использую последнюю версию pthreads - 2.9.1, загруженную с here, а файлы lib и include копируются в 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' 

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

Кстати, копирование 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"); 
} 

и мой 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 
+0

рассмотреть возможность использование MinGW -w64, он поставляется со встроенными pthreads –

+0

Это проблема для меня, так как у моего приложения есть другие проблемы с компиляцией с mingw-64. Так что мне действительно нужно mingw-32 – fx23

+0

, возможно, работа по исправлению этих проблем - mingw не работает –

ответ

2

С новой обновленной версией 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

+0

Спасибо Emilio, который мне очень помог! – fx23

Смежные вопросы