Nie można uruchomić programu, ponieważ brakuje libgcc_s_dw2-1.dll

166

Stworzyłem prosty program w C ++ z Code :: Blocks.

Jeśli uruchomię go z Code :: Blocks, działa poprawnie; ale jeśli uruchomię go przez podwójne kliknięcie pliku wykonywalnego, pojawi się okno z następującym komunikatem:

Nie można uruchomić programu, ponieważ na komputerze brakuje biblioteki libgcc_s_dw2-1.dll.
Spróbuj ponownie zainstalować program, aby rozwiązać ten problem.

Więc jaki jest problem? Co mam zrobić, żeby to naprawić?

xRobot
źródło

Odpowiedzi:

196

Uważam, że jest to problem kompilatora MinGW / gcc, a nie konfiguracja Microsoft Visual Studio.

libgcc_s_dw2-1.dllPowinien znajdować się w katalogu bin kompilatora. Możesz dodać ten katalog do zmiennej środowiskowej PATH w celu łączenia w czasie wykonywania, lub możesz uniknąć problemu, dodając „-static-libgcc -static-libstdc ++” do flag kompilatora.

Jeśli planujesz rozpowszechniać plik wykonywalny, ten drugi prawdopodobnie ma największy sens. Jeśli planujesz uruchomić go tylko na własnej maszynie, zmiana zmiennej środowiskowej PATH jest atrakcyjną opcją (ogranicza rozmiar pliku wykonywalnego).

Zaktualizowano:

Na podstawie opinii Grega Treleavena (patrz komentarze poniżej) dodaję linki do:

[Zrzut ekranu programu Code :: Blocks „Opcje budowania projektu”]

[Opcje linków GNU gcc]

Ta ostatnia dyskusja obejmuje opcje konsolidatora -static-libgcci -static-libstdc++.

twarda matematyka
źródło
Mam ten sam problem, co @xRobot i nie mogłem znaleźć nigdzie, aby dodać rzeczy do flag kompilatora, więc próbowałem dodać go do innych opcji, a następnie do opcji konsolidatora, a komunikat o błędzie nadal się pojawiał. Czy coś jest nie tak w tym, co robię?
Greg Treleaven,
@Greg Treleaven: Dla jasności budujesz plik wykonywalny za pomocą Code :: Block, działa on zgodnie z oczekiwaniami w środowisku IDE, ale zgłasza błąd „nie można uruchomić, ponieważ brakuje biblioteki libgcc_s_dw2-1.dll”, gdy próbujesz go uruchomić poza IDE. Sprawdziłeś katalog bin kompilatora i tak, ta biblioteka DLL faktycznie tam jest. Próbujesz rozwiązać problem, wykonując połączenie statyczne, które pobiera skompilowany kod z biblioteki, dzięki czemu biblioteka DLL (łączenie środowiska wykonawczego) nie jest potrzebna, ale nie działa. Dwie sugestie: wykonaj czystą kompilację (zmiana opcji może nie wywołać przebudowy) i spróbuj dodać zmienną PATH.
hardmath
@hardmath: Nadal nie działa po wykonaniu czystej przebudowy, więc myślę, że będę musiał użyć jednego z innych sposobów, aby to naprawić. Dzięki za pomoc.
Greg Treleaven,
@Greg Treleaven: Powodem próby dodania katalogu bin kompilatora do ścieżki PATH jest pokazanie (jeśli to działa), że plik wykonywalny jest nadal budowany w celu łączenia w czasie wykonywania standardowych bibliotek (DLL). Myślę, że problem polega na tym i musimy znaleźć (jeśli chcesz zrobić statyczne powiązanie kodu biblioteki), gdzie umieścić flagi kompilatora.
hardmath
4
Ta dyskusja trwa (i została rozwiązana) tutaj .
David C
37

W Eclipse znajdziesz go we właściwościach projektu> C / C ++ Build> Settings> MinGW C ++ Linker> Misc

Musisz dodać go do „flag konsolidatora” u góry; nigdzie indziej. Następnie po prostu odbuduj.

Zrzut ekranu właściwości Eclipse

Zauważyłem, że łączenie ich statycznie powoduje eksplozję rozmiaru do 1400 kb nawet przy optymalizacji. Jest o 277 kb większy w porównaniu do zwykłego kopiowania przez udostępnione biblioteki DLL. Po wykonaniu UPXing wszystkiego jest o 388kb większy. Bardzo tu stracić / stracić. Wystarczy dołączyć biblioteki DLL, ponieważ użytkownik końcowy może zdecydować o ich usunięciu lub nie, jeśli zainstalował je w innym miejscu.

TommyTom
źródło
1
Czy istnieje sposób, aby uniknąć dodawania flagi konsolidatora w każdym nowo utworzonym projekcie?
Roger Ng
Dla czytelników: Zwróć uwagę na opcje dodane na obrazku. To działa. To pomaga jako odniesienie: orfe.princeton.edu/help/article-296
PALEN
10

Code :: Blocks: dodaj „-static” w ustawieniach-> kompilator-> Ustawienia konsolidatora-> Inne opcje konsolidatora.

user1826947
źródło
1
To zadziałało idealnie dla mnie, jeśli chodzi o „brakującą” bibliotekę dll w tytule, jest tak szybkie i łatwe, że polecam najpierw wypróbować ten plik.
Paul Connolly,
Najlepsze rozwiązanie!
iyy0v
6

Znajdź tę bibliotekę dll na swoim komputerze i skopiuj ją do tego samego katalogu, w którym znajduje się plik wykonywalny.

Dave
źródło
dlaczego tak się nie dzieje w przypadku studia wizualnego?
xRobot
1
To również robi, ale z innymi bibliotekami dll. Przykłady, jeśli nie masz msvcrt90.dll, Twój skompilowany projekt wizualny nie uruchomi się (chociaż zwykle jest on instalowany w całym systemie)
Bruce,
6

Zobacz także . To rozwiązało mój problem.

Swoją drogą, czy to na pewno compilerflaga? Może linkerjest tutaj bardziej odpowiednie określenie?

gruby
źródło
1
+1 za poprawną terminologię! Tak, mój „link” do opcji dowiązania gcc był tego świadkiem (dla bibliotek statycznych).
hardmath
5

Skopiuj plik „libgcc_s_dw2-1.dll” do pliku make.exe. (Jeśli używasz Msys, skopiuj go do \ msys \ bin) Upewnij się, że ścieżka do make.exe jest ustawiona w pliku env. ŚCIEŻKA (jeśli make.exe znajduje się najprawdopodobniej w folderze „bin”, a masz plik msys, to jest to \ msys \ bin) Kompiluj, runduj, debuguj itp.

Blizz
źródło
5

Przejdź do drzewa MinGW http sourceforge.net. W sekcji Home / MinGW / Base / gcc / Version4 (lub jakiejkolwiek używanej wersji) / gcc-4 (wersja) / znajdziesz plik taki jak gcc-core-4.8.1-4-mingw32-dll.tar.lzma . Wyodrębnij go i przejdź do folderu bin, w którym znajdziesz swój plik libgcc_s_dw2-1.dll i inne pliki DLL. Skopiuj i wklej to, czego potrzebujesz, do katalogu bin.


źródło
5

Udało mi się to przezwyciężyć, używając „gcc” zamiast „g ++” w moim kompilatorze. Wiem, że to nie jest opcja dla większości ludzi, ale pomyślałem, że wspomnę o tym jako o opcji obejścia :)

rogerdpack
źródło
4

Nie możesz umieścić go w system32 lub czymś takim, jak robisz z innymi plikami dll, aby każdy program, który próbujesz uruchomić, nie miał tego problemu na twoim komputerze?

Potrzebuję tylko ścieżki, gdzie ją umieścić.

To trochę denerwujące, gdy umieszczam go w katalogu za każdym razem, gdy uruchamiam program, który właśnie zbudowałem ...

Edycja: znalazłem rozwiązanie:

Wyodrębnij libgcc_s_dw2-1.dll do lokalizacji na swoim komputerze. Zalecamy rozpakowanie go do katalogu programu żądającego libgcc_s_dw2-1.dll.

Jeśli to nie zadziała, będziesz musiał wyodrębnić libgcc_s_dw2-1.dll do katalogu systemowego. Domyślnie jest to:

  • C: \ Windows \ System (Windows 95/98 / Me)
  • C: \ WINNT \ System32 (Windows NT / 2000)
  • C: \ Windows \ System32 (Windows XP, Vista, 7)

W przypadku korzystania z 64-bitowej wersji systemu Windows należy również umieścić libgcc_s_dw2-1.dll w C: \ Windows \ SysWOW64 \

Upewnij się, że nadpisz wszystkie istniejące pliki (ale zrób kopię zapasową oryginalnego pliku). Zrestartuj swój komputer.

Jeśli problem nadal występuje, wypróbuj następujące rozwiązania:

  • Otwórz menu Start systemu Windows i wybierz „Uruchom ...”.
  • Wpisz CMD i naciśnij Enter (lub, jeśli używasz Windows ME, wpisz COMMAND)).
  • Wpisz regsvr32 libgcc_s_dw2-1.dll i naciśnij Enter.
yossi
źródło
12
Nie publikuj tutaj komentarzy jako odpowiedzi. Nie tak działa przepełnienie stosu. Nie zajdziesz daleko, używając „u” zamiast „ty” i „cos” zamiast „ponieważ”. Rozmowa na czacie jest tutaj szczególnie niedozwolona.
meagar
4

Po prostu przejdź do Ustawienia >> Kompilator i debuger, a następnie kliknij kartę Ustawienia konsolidatora i przejdź do kontrolki edycji „Inne opcje konsolidatora” i wklej: „-static-libgcc -static-libstdc ++” do niego, nie ma opcji flagi kompilatora w opcjach Compiler Flags dla Code :: Blocks, więc to jest sposób na rozwiązanie tego problemu. Przyszedłem tutaj również szukając rozwiązania, a jeden facet, który napisał o "-static-libgcc -static-libstdc ++" podał właściwy pomysł i Resztę wymyśliłem przypadkowo, ale zadziałało, plik jest teraz klikalny z zewnątrz Code :: Blocks, działa bezpośrednio z pulpitu.

Jack Offington
źródło
3

Dodaj ścieżkę do tej biblioteki dll do zmiennej środowiskowej PATH.

Bojan Komazec
źródło
dlaczego tak się nie dzieje w przypadku studia wizualnego?
xRobot
Prawdopodobnie dlatego, że ścieżka do tej biblioteki dll jest wymieniona w VisualStudio's Tools-> Options-> Projects and Solutions -> VC ++ Directories -> Executable Files. Program Visual Studio szuka tutaj i w zmiennej środowiskowej PATH podczas wyszukiwania ścieżek do bibliotek dll.
Bojan Komazec
2

W tym -static-libgcc na linii opracowującym, rozwiązuje ten problem

g++ my.cpp -o my.exe -static-libgcc

Według: @hardmath

Możesz także utworzyć alias w swoim profilu [.profile], jeśli korzystasz na przykład z MSYS2

alias g++="g++ -static-libgcc"

Teraz twoje polecenie GCC również przechodzi ;-)

Pamiętaj, aby ponownie uruchomić terminal

PYK
źródło
1

Dodanie „-static” do innych opcji konsolidatora rozwiązuje ten problem. Miałem ten sam problem po przetestowaniu tego na innym systemie, ale nie na własnym, więc nawet jeśli nie zauważyłeś tego w swoim systemie programistycznym, powinieneś sprawdzić, czy masz ten zestaw, jeśli łączysz statycznie.

Kolejna uwaga, skopiowanie biblioteki DLL do tego samego folderu, w którym znajduje się plik wykonywalny, nie jest rozwiązaniem, ponieważ jest sprzeczne z ideą łączenia statycznego.

Inną opcją jest użycie wersji TDM MinGW, która rozwiązuje ten problem.

Zaktualizuj edycję: może to nie rozwiązać problemu dla wszystkich. Innym powodem, który niedawno odkryłem, jest to, że używasz biblioteki skompilowanej przez kogoś innego, w moim przypadku był to SFML, który został nieprawidłowo skompilowany i wymagał biblioteki DLL, która nie istniała, ponieważ została skompilowana z inną wersją MinGW niż ta, którą ja posługiwać się. Używam kompilacji krasnoluda, ta używała innej, więc nigdzie nie miałem biblioteki DLL i oczywiście nie chciałem jej, ponieważ była to kompilacja statyczna. Rozwiązaniem może być znalezienie innej kompilacji biblioteki lub zbudowanie jej samodzielnie.

Neil Roy
źródło
0

Pracując z msys2 otrzymałem ten sam błąd podczas próby wykonania wersji mojego projektu w środowisku debugowania. Rozwiązanie mojego problemu jest oczywiste: użyj pliku wykonywalnego z symbolami debugowania.

Rubén Pozo
źródło
0

W CodeBlocks możesz przejść do Ustawienia ... Kompilator ... i wybrać albo 1) dwa elementy w niebieskim polu albo 2) jeden element w zielonym polu

Ustawienia kompilatora Codeblocks

raddevus
źródło