webentwicklung-frage-antwort-db.com.de

Wie statische Verknüpfung von libwinpthread-1.dll in MingW zu tun?

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.

47
rsk82

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

21
Tomasz Lis

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.

42
rubenvb

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.

26
Star Brilliant

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:

  • Die Option "Gesamtes Archiv" sollte sofort danach deaktiviert werden.
  • Sie müssen diesen Hack nicht ausführen, wenn Ihr Programm tatsächlich Symbole aus der Bibliothek verwendet (d. H. Sie verwenden <thread> von C++ 11). In diesem Fall wird die Bibliothek nicht gelöscht, wenn Sie sie statisch verknüpfen.
  • Dieser Hack ist für MinGW-w64 gedacht, um die libwinpthread-1.dll Abhängigkeiten zu beheben.
15
user7023624

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")
3
Syndog

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.

0