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.