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 .

44
demandé sur rsk82 2012-12-07 22:00:52

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".

18
répondu Tomasz Lis 2012-12-25 14:22:17

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++ .

37
répondu rubenvb 2014-09-16 14:25:32

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.

23
répondu Star Brilliant 2015-01-17 15:56:11

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.
10
répondu user7023624 2017-04-13 21:52:43

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")
1
répondu Syndog 2017-03-23 14:58:44

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.

0
répondu Newb I the Newbd 2018-07-30 21:18:08

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.

-2
répondu yellowjacket05 2014-01-31 02:33:16

il suffit d'ajouter -static à votre CFLAGS .

par exemple: ./configure CFLAGS="-static" .

cela reliera toutes les bibliothèques statiques à votre fichier exécutable.

-2
répondu Neobry 2014-10-29 08:05:49