jak zrobić statyczne linkowanie libwinpthread-1.dll w mingw?

Używam mingw stąd: 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

I udało mi się połączyć statycznie libstdc++-6.dll i libgcc_s_sjlj-1.dll za pomocą parametrów -static-libgcc -static-libstdc++, ale nie mogę znaleźć polecenia do zrobienia tego samego z libwinpthread-1.dll.

Author: rsk82, 2012-12-07

8 answers

Prawdopodobnie powinieneś sprawdzić dokumentację opcji wiersza poleceń dla GCC.

Nie jest to polecenie '- static-something', tylko standardowe biblioteki (libgcc i libstdc++) mogą być ustawione na statyczne łączenie za pomocą jednego polecenia. W przypadku innych bibliotek, najpierw przełącz się na linkowanie statyczne za pomocą "- static", a następnie wypisz biblioteki, które mają zostać dołączone za pomocą oddzielnych komend, np. "- lpthread".

 18
Author: Tomasz Lis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-25 14:22:17

Jeśli twój toolchain zawiera statyczne winpthreads, Dodaj opcję

-static

Pobierze statyczne wersje wszystkich bibliotek, które może.

Alternatywnie, możesz usunąć libwinpthread.dll.a i samego DLL z katalogów toolchain. Może to jednak zepsuć programy łączące się z bibliotekami libstdc++ i Libgcc DLL, więc bądź ostrożny.

Trzecią opcją jest użycie -Wl,-Bdynamic i -Wl,-Bstatic, aby wybrać wersję, w której chcesz się połączyć (czyli to, co wewnętrznie robi -static, gdy LD jest called). Przykład:

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

Jeśli uruchomisz polecenie link z dodaną -v, powinieneś zobaczyć te opcje pojawiające się w wywołaniu ld/collect2, gdy używasz -static-libgcc i -static-libstdc++.

 37
Author: rubenvb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-16 14:25:32

Spróbuj tego:

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

Zwróć uwagę na -lstdc++ Przed -lpthread. U mnie zadziałało.

Upewnij się, że dodałeś to na samym końcu linii poleceń g++.

 23
Author: Star Brilliant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-17 15:56:11

Aby statycznie połączyć winpthread nawet jeśli wątek nie jest używany w programie, przekaż linkerowi parametry -Bstatic i --whole-archive:

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

Uwaga:

  • opcja "całe archiwum" powinna zostać wyłączona natychmiast po tym.
  • nie musisz tego hakować, jeśli twój program faktycznie używa symboli z biblioteki (tzn. używasz <thread> z C++11), W takim przypadku biblioteka nie zostanie upuszczona, gdy statycznie ją połączysz.
  • Ten hack jest przeznaczony do MinGW-w64, do naprawy libwinpthread-1.dll zależności.
 10
Author: user7023624,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-13 21:52:43

Dla każdego, kto pracuje w CMake, To rozwiązanie jest łatwo zaimplementowane w Twoich Cmakelistach.plik txt w następujący sposób...

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static")
 1
Author: Syndog,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-23 14:58:44

Najwyraźniej CMake robi dziwne rzeczy z tym, jak obsługiwane są flagi kompilatora -Wl, co sprawia, że rozwiązanie -Wl,-Bstatic -lstdc++ -lwinpthread -Wl,-Bdynamic nie działa, z widocznymi tylko dwiema innymi opcjami: złą flagą kompilatora -static i brzydką flagą kompilatora -Wl,--whole-archive.

Tymczasem dobrą opcją, która faktycznie działa w CMake, ale wydaje się raczej nieudokumentowana, jest bezpośrednie użycie FLAG linkera. Z tego powodu w CMake jest to najlepszy sposób na statyczne połączenie ze wszystkimi zależnościami C++ mingw-w64:

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

It należy zauważyć, że nawet jeśli nie ma biblioteki bezpośrednio po -dynamic, powinna ona być nadal stosowana w celu zapewnienia, że standardowe, niejawnie połączone biblioteki zostaną poprawnie połączone.

 0
Author: Newb I the Newbd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-30 21:18:08

Miałem ten sam problem. Używam Code:: Blocks i udało mi się dodać dodatkową linię w komendach linkera:

-lpthread -L libwinpthread-1.dll

Polecenie to powinno być dodawane wszędzie tam, gdzie zaimplementujesz inne polecenia linkera, takie jak:

-static-libgcc
-static-libstdc++

Nie otrzymuję błędów kompilacji ani ostrzeżeń podczas implementacji tego polecenia. Pierwsza dyrektywa, -lpthread, Określa plik nagłówkowy, a dyrektywa końcowa, -L, jest używana do łączenia określonego pliku.

Używam gcc w wersji 4.8.1. Ta późniejsza wersja zawiera poprawki błędów dla * to_string*, na przykład których potrzebowałem.

 -2
Author: yellowjacket05,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-31 02:33:16

Po prostu dodaj -static do swojego CFLAGS.

Na przykład: ./configure CFLAGS="-static".

Spowoduje połączenie wszystkich bibliotek statycznych z Twoim plikiem wykonywalnym.

 -2
Author: Neobry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-29 08:05:49