Я хотел бы статически связать «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
рассмотреть возможность использование MinGW -w64, он поставляется со встроенными pthreads –
Это проблема для меня, так как у моего приложения есть другие проблемы с компиляцией с mingw-64. Так что мне действительно нужно mingw-32 – fx23
, возможно, работа по исправлению этих проблем - mingw не работает –