comment faire la liaison statique de libwinpthread-1.dll à mingw?
  j'utilise mingw d'ici:  http://sourceforge.net/projects/mingwbuilds/files/host-windows/releases/4.7.2/32-bit/threads-posix/sjlj/x32-4.7.2-release-posix-sjlj-rev2.7z/download   
 et j'ai réussi à lier statiquement libstdc++-6.dll et libgcc_s_sjlj-1.dll en utilisant les paramètres -static-libgcc -static-libstdc++ , mais je ne trouve pas de commande pour faire la même chose avec libwinpthread-1.dll .  
8 réponses
vous devriez probablement vérifier la documentation des options de ligne de commande pour GCC.
ce n'est pas une commande '-static-something', seules les bibliothèques standard (libgcc et libstdc++) peuvent être configurées pour des liens statiques avec une commande. Pour les autres bibliothèques, vous passez d'abord au lien statique avec "-static", puis à la liste des bibliothèques à inclure avec des commandes séparées, à savoir "-lpthread".
si votre chaîne à outils inclut les têtes winpthreads statiques, en ajoutant l'option
-static
  
  va tirer dans les versions statiques de toutes les bibliothèques qu'il peut.
alternativement, vous pouvez supprimer libwinpthread.DLL.a et la DLL elle-même à partir des répertoires de la chaîne d'outils. Cela pourrait toutefois perturber les programmes qui lient avec libstdc++ et libgcc DLLs, alors faites attention.
  une troisième option est d'utiliser  -Wl,-Bdynamic  et  -Wl,-Bstatic  pour sélectionner version dans laquelle vous voulez lier (ce que  -static  fait en interne lorsque ld est appelé). Un exemple:  
gcc -o someexec someobject.o -Wl,-Bdynamic -lsomelibIwantshared -Wl,-Bstatic -lsomelibIwantstatic
  
   si vous exécutez votre commande link avec -v ajouté, vous devriez voir ces options apparaître dans l'invocation LD/collect2 lorsque vous utilisez -static-libgcc et -static-libstdc++ .  
essayez ceci:
-static-libgcc -static-libstdc++ -Wl,-Bstatic -lstdc++ -lpthread -Wl,-Bdynamic
  
    Avis  -lstdc++  avant  -lpthread  . Il a travaillé pour moi.  
 , assurez-vous d'ajouter ceci à la fin de votre  g++  ligne de commande.  
  pour lier statiquement    winpthread    même si le filetage n'est pas utilisé dans le programme, passer les paramètres  -Bstatic  et  --whole-archive  au linker:  
g++ -o hello.exe hello.cpp -Wl,-Bstatic,--whole-archive -lwinpthread -Wl,--no-whole-archive
  
  Note:
- l'option "archive entière" doit être désactivée immédiatement après.
 -   vous n'avez pas besoin de faire ce piratage si votre programme utilise réellement des symboles de la bibliothèque (i.e. vous utilisez  
<thread>de C++11), auquel cas la bibliothèque ne sera pas abandonnée quand vous la lierez statiquement. - ce hack est destiné à MinGW-w64, pour fixer le libwinpthread-1.dll dépendances.
 
pour toute personne travaillant à CMake, cette solution est facilement implémentée dans vos listes Cmakel.fichier txt comme suit...
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static")
  
    	                  apparemment, CMake fait quelque chose de bizarre avec la façon dont les drapeaux de compilateur  -Wl  sont manipulés, faisant de la solution  -Wl,-Bstatic -lstdc++ -lwinpthread -Wl,-Bdynamic  ne fonctionne pas, avec seulement deux autres options apparemment à gauche: le mauvais drapeau de compilateur  -static  et le drapeau de compilateur laid  -Wl,--whole-archive  .  
pendant ce temps, la bonne option qui fonctionne réellement dans CMake, mais semble plutôt non documentée, est d'utiliser directement les drapeaux de linker. Par conséquent, dans CMake, cela semble être la meilleure façon d'établir un lien statique avec toutes les dépendances c++ mingw-w64:
target_link_libraries (MyVeryAwesomeApp -static gcc stdc++ winpthread -dynamic)
  
   il est à noter que même s'il n'y a pas de bibliothèque qui suit explicitement -dynamic , il faut quand même l'appliquer afin de s'assurer que les bibliothèques standards, implicitement liées, soient correctement liées.  
j'ai eu le même problème. J'utilise le Code:: Blocks, et j'ai eu du succès en ajoutant une ligne supplémentaire dans linker commmands:
-lpthread -L libwinpthread-1.dll
  
  cette commande doit être ajoutée partout où vous mettez en œuvre d'autres commandes de linker telles que:
-static-libgcc
-static-libstdc++
  
  Je ne reçois aucune erreur de compilation ni aucun avertissement lors de la mise en œuvre de cette commande. La première directive, - lpthread , spécifie le fichier d'en-tête, et la directive suivante, - L , est utilisée pour lier un fichier spécifique.
j'utilise la version 4.8.1 de gcc. Cette version ultérieure contient des corrections de bugs pour *to_string*, par exemple dont j'avais besoin.
  il suffit d'ajouter  -static à votre CFLAGS .  
 par exemple: ./configure CFLAGS="-static" .  
cela reliera toutes les bibliothèques statiques à votre fichier exécutable.