hoe statisch linken van libwinpthread-1.dll in mingw?

Ik gebruik mingw vanaf 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

En ik ben er met succes in geslaagd om libstdc++-6.dllen libgcc_s_sjlj-1.dllstatisch te koppelen met behulp van -static-libgcc -static-libstdc++parameters, maar ik kan geen commando vinden om hetzelfde te doen met libwinpthread-1.dll.


Antwoord 1, autoriteit 100%

Als uw toolchain de statische winpthreads bevat, voegt u de optie toe

-static

Zal statische versies binnenhalen van alle bibliotheken die het kan.

Als alternatief kunt u libwinpthread.dll.a en de DLL zelf uit de toolchain-mappen verwijderen. Dit kan programma’s die linken met libstdc++ en libgcc DLL’s echter verknoeien, dus wees voorzichtig.

Een derde optie is om -Wl,-Bdynamicen -Wl,-Bstaticte gebruiken om te selecteren naar welke versie je wilt linken (wat is wat -staticintern doet wanneer ld wordt aangeroepen). Een voorbeeld:

gcc -o someexec someobject.o -Wl,-Bdynamic -lsomelibIwantshared -Wl,-Bstatic -lsomelibIwantstatic

Als u uw link-opdracht uitvoert met -vtoegevoegd, zou u deze opties moeten zien verschijnen in de ld/collect2-aanroep wanneer u -static-libgccen -static-libstdc++.


Antwoord 2, autoriteit 67%

Probeer dit:

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

Let op de -lstdc++vóór -lpthread. Het werkte voor mij.

Zorg ervoor dat u dit helemaal aan het einde van uw g++-opdrachtregel toevoegt.


Antwoord 3, autoriteit 53%

U moet waarschijnlijk de documentatie met opdrachtregelopties voor GCC raadplegen.

Dit is geen ‘-static-something’-commando, alleen standaardbibliotheken (libgcc en libstdc++) kunnen met één commando op statische koppeling worden ingesteld. Voor andere bibliotheken schakelt u eerst over naar statische koppeling met “-static” en vermeldt u vervolgens de bibliotheken die u wilt opnemen met afzonderlijke opdrachten, bijv. “-lpthread”.


Antwoord 4, autoriteit 45%

Om winpthreadstatisch te linken, zelfs als threading niet in het programma wordt gebruikt, geeft u de parameters -Bstaticen --whole-archivedoor naar de linker:

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

Let op het volgende:

  • De optie “hele archief” moet onmiddellijk daarna worden uitgeschakeld.
  • U hoeft deze hack niet uit te voeren als uw programma daadwerkelijk symbolen uit de bibliotheek gebruikt (dwz u gebruikt <thread>uit C++11), in welk geval de bibliotheek dat wel doet. niet wegvallen als je het statisch koppelt.
  • Deze hack is bedoeld voor MinGW-w64, om de libwinpthread-1.dll-afhankelijkheden te repareren.

Antwoord 5, autoriteit 14%

Voor iedereen die in CMake werkt, deze oplossing kan als volgt gemakkelijk worden geïmplementeerd in uw CMakeLists.txt-bestand…

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

Antwoord 6, autoriteit 8%

Blijkbaar doet CMake rare dingen met de manier waarop de -Wlcompilervlaggen worden behandeld, waardoor de -Wl,-Bstatic -lstdc++ -lwinpthread -Wl,-Bdynamicoplossing werkt niet, met slechts twee andere opties schijnbaar over: de slechte compilervlag -staticen de lelijke compilervlag -Wl,--whole-archive.

Ondertussen is de goede optie die echt werkt in CMake, maar toch nogal ongedocumenteerd lijkt, om de linker-vlaggen rechtstreeks te gebruiken. Daarom lijkt dit in CMake de beste manier om statisch te linken naar alle mingw-w64 C++-afhankelijkheden:

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

Opgemerkt moet worden dat zelfs als er geen bibliotheek is die expliciet -dynamicvolgt, deze toch moet worden toegepast om ervoor te zorgen dat de standaard, impliciet gekoppelde bibliotheken correct worden gekoppeld.

p>


Antwoord 7, autoriteit 2%

Ik heb dit probleem omzeild door de win32-variant van de mingw-toolchain te gebruiken in plaats van de posix-variant. Met de win32-variant is -static-libgcc -static-libstdc++voldoende voor een onafhankelijke build.


Antwoord 8

Gewoon linken met -l:libwinpthread.a


Antwoord 9

Voeg gewoon -statictoe aan uw CFLAGS.

Bijvoorbeeld: ./configure CFLAGS="-static".

Hiermee worden alle statische bibliotheken gekoppeld aan uw uitvoerbare bestand.

Other episodes