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.dll
en libgcc_s_sjlj-1.dll
statisch 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,-Bdynamic
en -Wl,-Bstatic
te gebruiken om te selecteren naar welke versie je wilt linken (wat is wat -static
intern 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 -v
toegevoegd, zou u deze opties moeten zien verschijnen in de ld/collect2-aanroep wanneer u -static-libgcc
en -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 -Bstatic
en --whole-archive
door 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 -Wl
compilervlaggen worden behandeld, waardoor de -Wl,-Bstatic -lstdc++ -lwinpthread -Wl,-Bdynamic
oplossing werkt niet, met slechts twee andere opties schijnbaar over: de slechte compilervlag -static
en 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 -dynamic
volgt, 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 -static
toe aan uw CFLAGS
.
Bijvoorbeeld: ./configure CFLAGS="-static"
.
Hiermee worden alle statische bibliotheken gekoppeld aan uw uitvoerbare bestand.