2016-08-29 2 views
1

Je voudrais lier statiquement "pthreads pour Win32" avec mon application, compilé avec MinGW32 afin que l'application n'ait pas besoin de pthreadGC2.dll pour fonctionner.pthreads liaison statique avec MinGW

J'utilise la dernière version de pthreads - 2.9.1, téléchargée à partir de here et les fichiers include et lib sont copiés dans la librairie MinGW et incluent les répertoires. Lorsque je cherchais sur le Web comment faire cela, je suis tombé sur this thread qui demande l'utilisation des drapeaux -static-libgcc -static-libstdC++. Cela ne fonctionne pas, ce qui signifie que l'application compile mais ne peut pas fonctionner sans pthreadGC2.dll présent.

Ils recommandent également d'utiliser -static -static-libgcc -static-libstdC++. Cela ne compile pas avec l'erreur suivante:

main.o:main.cpp:(.text+0x461): undefined reference to `_imp__pthread_create' 
main.o:main.cpp:(.text+0x4be): undefined reference to `_imp__pthread_join' 

Est-ce que quelqu'un sait comment faire cela? Par ailleurs - coping pthreadGC2.dll téléchargé à partir de la version 2.9.1 (à l'intérieur de pthreads-w32-2.9.1-1-mingw32-dll.tar.lzma) dans le dossier de l'application ne suffit pas. Pour lancer l'application, je devrais également copier une autre DLL: libgcc_s_dw2-1.dll. Ceci est vraiment mauvais pour moi - je ne voudrais pas faire mes utilisateurs ont ces 2 DLLs chaque fois qu'ils veulent exécuter mon application

Voici mon code:

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

et mon 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 envisager d'utiliser -w64, il est livré avec pthreads intégré –

+0

C'est un problème pour moi car mon application a d'autres problèmes de compilation avec mingw-64. Donc, j'ai vraiment besoin de mingw-32 – fx23

+0

peut-être travailler sur la résolution de ces problèmes - mingw est défunte –

Répondre

2

Avec la nouvelle version mise à jour de MinGW, vous pouvez obtenir la version 2.10 de la bibliothèque pthread-win32. Parmi plusieurs changements et corrections de bugs, vous pouvez trouver la possibilité de le lier statiquement. Il suffit d'inclure -lpthread dans la liste des bibliothèques statiques.

Voici un exemple de mélange liaison statique avec la bibliothèque pthread et la liaison Dinamic avec une bibliothèque de Windows:

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

Avec cela, vous relâchez la charge supportée libgcc_s_dw2-1.dll

+0

Merci Emilio qui m'a beaucoup aidé! – fx23