web-dev-qa-db-fra.com

comment faire une liaison statique de libwinpthread-1.dll dans 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 -static-libgcc -static-libstdc++ paramètres, mais je ne trouve pas de commande pour faire de même avec libwinpthread-1.dll.

47
rsk82

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 définies sur une liaison statique avec une seule commande. Pour les autres bibliothèques, vous passez d'abord à la liaison statique avec "-static", puis vous listez les bibliothèques à inclure avec des commandes distinctes, par exemple "-lpthread".

21
Tomasz Lis

Si votre chaîne d'outils comprend les winpthreads statiques, ajouter l'option

-static

Tirera dans les versions statiques de toutes les bibliothèques qu'il peut.

Alternativement, vous pouvez supprimer libwinpthread.dll.a et le DLL lui-même des répertoires de la chaîne d'outils. Cela pourrait gâcher les programmes se liant aux libstdc ++ et libgcc DLL, alors soyez prudent.

Une troisième option consiste à utiliser -Wl,-Bdynamic et -Wl,-Bstatic pour sélectionner dans quelle version vous souhaitez lier (qui est 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 de liaison avec -v ajouté, vous devriez voir ces options apparaître dans l'invocation ld/collect2 lorsque vous utilisez -static-libgcc et -static-libstdc++.

42
rubenvb

Essaye ça:

-static-libgcc -static-libstdc++ -Wl,-Bstatic -lstdc++ -lpthread -Wl,-Bdynamic

Remarquez le -lstdc++ avant -lpthread. Ça a marché pour moi.

Assurez-vous d'ajouter ceci à la fin de votre g++ ligne de commande.

26
Star Brilliant

Pour lier statiquement winpthread même si le filetage n'est pas utilisé dans le programme, passez le -Bstatic et --whole-archive paramètres à l'éditeur de liens:

g++ -o hello.exe hello.cpp -Wl,-Bstatic,--whole-archive -lwinpthread -Wl,--no-whole-archive

Notez les points suivants:

  • L'option "archive entière" doit être désactivée immédiatement après.
  • Vous n'avez pas besoin de faire ce hack si votre programme utilise réellement des symboles de la bibliothèque (c'est-à-dire que vous utilisez <thread> de C++ 11), auquel cas la bibliothèque ne sera pas supprimée lorsque vous la liez statiquement.
  • Ce hack est destiné à MinGW-w64, pour corriger les dépendances libwinpthread-1.dll .
15
user7023624

Pour toute personne travaillant dans CMake, cette solution est facilement implémentée dans votre fichier CMakeLists.txt comme suit ...

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static")
3
Syndog

Apparemment, CMake fait des trucs bizarres avec la façon dont le -Wl les drapeaux du compilateur sont gérés, ce qui rend -Wl,-Bstatic -lstdc++ -lwinpthread -Wl,-Bdynamic la solution ne fonctionne pas, avec seulement deux autres options apparemment à gauche: le mauvais indicateur du compilateur -static et l'indicateur 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 indicateurs de l'éditeur de liens. Par conséquent, dans CMake, cela semble être le meilleur moyen de lier statiquement à toutes les dépendances Cingling Mingw-w64:

target_link_libraries (MyVeryAwesomeApp -static gcc stdc++ winpthread -dynamic)

Il convient de noter que même s'il n'y a pas de bibliothèque suivant explicitement -dynamic, il doit toujours être appliqué afin de garantir que les bibliothèques standard implicitement liées sont correctement liées.

0
Newb I the Newbd