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