Ich benutze mingw von hier: 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
Und ich habe es erfolgreich geschafft, statisch libstdc++-6.dll
Und libgcc_s_sjlj-1.dll
Mithilfe von -static-libgcc -static-libstdc++
- Parametern zu verknüpfen, aber ich kann keinen Befehl finden, um dasselbe mit libwinpthread-1.dll
Zu tun.
Sie sollten wahrscheinlich die Dokumentation der Befehlszeilenoptionen für GCC überprüfen.
Dies ist kein '-static-something'-Befehl, nur Standardbibliotheken (libgcc und libstdc ++) können mit einem Befehl auf statische Verknüpfung gesetzt werden. Bei anderen Bibliotheken wechseln Sie zuerst mit "-static" zur statischen Verknüpfung und listen dann die einzuschließenden Bibliotheken mit separaten Befehlen auf, dh "-lpthread".
Wenn Ihre Toolchain die statischen Winpthreads enthält, fügen Sie die Option hinzu
-static
Liefert statische Versionen aller Bibliotheken, die es kann.
Alternativ können Sie libwinpthread.dll.a und die DLL selbst aus den Toolchain-Verzeichnissen entfernen. Dies kann jedoch zu Problemen bei Programmen führen, die mit libstdc ++ - und libgcc-DLLs verknüpft sind. Seien Sie also vorsichtig.
Eine dritte Möglichkeit besteht darin, mit -Wl,-Bdynamic
Und -Wl,-Bstatic
Auszuwählen, in welche Version Sie verlinken möchten (was -static
Intern macht, wenn ld aufgerufen wird). Ein Beispiel:
gcc -o someexec someobject.o -Wl,-Bdynamic -lsomelibIwantshared -Wl,-Bstatic -lsomelibIwantstatic
Wenn Sie Ihren Link-Befehl mit -v
Ausführen, sollten diese Optionen im Aufruf von ld/collect2 erscheinen, wenn Sie -static-libgcc
Und -static-libstdc++
Verwenden.
Versuche dies:
-static-libgcc -static-libstdc++ -Wl,-Bstatic -lstdc++ -lpthread -Wl,-Bdynamic
Beachten Sie die -lstdc++
Vor -lpthread
. Es hat bei mir funktioniert.
Stellen Sie sicher, dass Sie dies ganz am Ende Ihres g++
Befehlszeile.
Um winpthread statisch zu verknüpfen, auch wenn im Programm kein Threading verwendet wird, übergeben Sie -Bstatic
und --whole-archive
Parameter zum Linker:
g++ -o hello.exe hello.cpp -Wl,-Bstatic,--whole-archive -lwinpthread -Wl,--no-whole-archive
Beachten Sie das Folgende:
<thread>
von C++ 11). In diesem Fall wird die Bibliothek nicht gelöscht, wenn Sie sie statisch verknüpfen.Für alle, die in CMake arbeiten, ist diese Lösung in Ihrer CMakeLists.txt-Datei wie folgt implementiert ...
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static")
Anscheinend macht CMake einige seltsame Dinge mit dem Umgang mit den -Wl
- Compiler-Flags, sodass die -Wl,-Bstatic -lstdc++ -lwinpthread -Wl,-Bdynamic
- Lösung nicht funktioniert, da nur zwei andere Optionen offenbar übrig bleiben: das schlechte Compiler-Flag -static
und das hässliche Compiler-Flag -Wl,--whole-archive
.
Die gute Option, die tatsächlich in CMake funktioniert, jedoch nicht dokumentiert zu sein scheint, ist die direkte Verwendung der Linker-Flags. Daher scheint dies in CMake die beste Möglichkeit zu sein, statische Verknüpfungen zu allen C++ - Abhängigkeiten von mingw-w64 herzustellen:
target_link_libraries (MyVeryAwesomeApp -static gcc stdc++ winpthread -dynamic)
Es sollte beachtet werden, dass eine Bibliothek, die nicht explizit auf -dynamic
Folgt, trotzdem angewendet werden sollte, um sicherzustellen, dass die implizit verknüpften Standardbibliotheken korrekt verknüpft werden.