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
.
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".
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++
.
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.
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:
<thread>
de C++ 11), auquel cas la bibliothèque ne sera pas supprimée lorsque vous la liez statiquement.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")
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.