2011-01-15 11 views
138

Stworzyłem prosty program w C++ z Code :: Blocks.Program nie może się uruchomić, ponieważ brakuje biblioteki libgcc_s_dw2-1.dll.

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

Program nie może zostać uruchomiony, ponieważ na komputerze brakuje biblioteki libgcc_s_dw2-1.dll.
Spróbuj ponownie zainstalować program, aby rozwiązać ten problem.

Jaki jest problem? Co muszę zrobić, żeby to naprawić?

Odpowiedz

165

Wierzę, że jest to problem z kompilatorem MinGW/gcc, a nie z instalacją Microsoft Visual Studio.

Plik libgcc_s_dw2-1.dll powinien znajdować się w katalogu bin kompilatora. Możesz dodać ten katalog do zmiennej środowiskowej PATH do łą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).

Aktualizacja:

oparciu o informacje zwrotne od Greg Treleaven (patrz komentarz poniżej) Dodaję linki do:

[Screenshot of Code::Blocks "Project build options"]

[GNU gcc link options]

Ta ostatnia dyskusja obejmuje -static-libgcc i -static-libstdc++ opcji linkera.

+0

Mam ten sam problem co @xRobot i nie mogłem nigdzie znaleźć dodatków do flag kompilatora, więc próbowałem dodać go do Inne opcje, a następnie Opcje Linkera, a komunikat o błędzie nadal występował. Czy coś jest nie w porządku z tym, co robię? –

+0

@Greg Treleaven: Dla jasności, tworzysz plik wykonywalny z Code :: Block, działa on zgodnie z oczekiwaniami wewnątrz IDE, ale zgłasza błąd "nie można uruchomić, ponieważ libgcc_s_dw2-1.dll brakuje" podczas próby uruchomienia poza IDE. Sprawdziłeś katalog bin kompilatora i tak, ta biblioteka DLL faktycznie istnieje. Próbujesz naprawić problem, wykonując statyczne powiązanie, które pobiera skompilowany kod z biblioteki, więc biblioteka DLL (linkowanie w czasie wykonywania) nie jest potrzebna, ale nie działa. Dwie sugestie: Wykonaj czystą kompilację (zmieniając opcje mogą nie powodować odbudowy) i spróbuj dodać zmienną PATH. – hardmath

+0

@hardmath: Nadal nie działa po wykonaniu czystej odbudowy, więc myślę, że będę musiał użyć jednego z innych sposobów, aby to naprawić. Dzięki za pomoc. –

4

Znajdź ten dll na komputerze, a następnie skopiować go w tym samym katalogu plik wykonywalny znajduje.

+0

dlaczego tak się nie dzieje w studiu visual? – xRobot

+0

To również robi, ale z innymi bibliotekami dll. Przykładowo, jeśli brakuje msvcrt90.dll, Twój projekt skompilowany wizualnie się nie uruchomi (zazwyczaj jest to system zainstalowany na całym systemie). – Bruce

3

Dodaj ścieżkę do tego DLL do zmiennej środowiskowej PATH.

+0

Dlaczego tak się nie dzieje w studiu graficznym? – xRobot

+0

Prawdopodobnie dlatego, że ścieżka do tej biblioteki znajduje się w Narzędziach VisualStudio-> Opcje-> Projekty i rozwiązania -> Katalogi VC++ -> Pliki wykonywalne. Visual Studio szuka tutaj i zmiennej środowiskowej PATH podczas wyszukiwania ścieżek do bibliotek dll. –

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 env. PATH (jeśli make.exe znajduje się w folderze "bin", najprawdopodobniej i masz msys, to \ msys \ bin) Skompiluj, przeglądaj, debuguj, itp. Szczęśliwy.

4

Zobacz also. Rozwiązał mój problem.

Przy okazji, czy jest to z pewnością flaga compiler? Może bardziej odpowiedni termin to linker?

+0

+1 za prawidłową terminologię! Tak, moje "łącze" do opcji linku gcc było tego pewnym (dla bibliotek statycznych). – hardmath

32

W Eclipse, znajdziesz go w ramach projektu Właściwości> C/C++ Budowanie> Ustawienia> MinGW C++ Linker> Inne

Musisz go dodać do "łącznik" flagi na szczycie; nigdzie indziej. Następnie po prostu odbuduj.

Eclipse properties screenshot

I odkryli, że łączenie tych statycznie eksploduje maksymalny rozmiar 1,400kb nawet z optymalizacje. Jest większy o 277 kb w porównaniu do zwykłego kopiowania za pośrednictwem współużytkowanych bibliotek DLL. Jest o 388kb większy także po UPXing wszystko. Tutaj bardzo przegrywa/przegrywa. Wystarczy dołączyć biblioteki DLL, ponieważ użytkownik końcowy może zdecydować o ich usunięciu, jeśli zainstalują je w innym miejscu.

+1

Czy istnieje sposób na uniknięcie dodania flagi linkera w każdym nowo utworzonym projekcie? –

+0

Dla czytelników: Zwróć uwagę na opcje dodane do obrazu. To działa. To pomaga jako punkt odniesienia: https://orfe.princeton.edu/help/article-296 – PALEN

3

Nie możesz umieścić go w systemie32 lub coś podobnego do innych plików dll, więc każdy program, który spróbujesz uruchomić, nie będzie miał problemu z twoim komputerem?

Po prostu potrzebuję ścieżki, gdzie ją umieścić.

Jest to trochę irytujące, aby umieścić go w katalogu, za każdym razem mogę uruchomić program po prostu zbudowany ...

Edit: znalazłem rozwiązanie:

Extract libgcc_s_dw2-1.dll do lokalizacja na twoim komputerze. My zalecamy rozpakować go do katalogu programu, który jest żądając libgcc_s_dw2-1.dll.

Jeśli to nie zadziała, będziesz musiał wyodrębnić plik libgcc_s_dw2-1.dll do swojego 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)

Jeśli używasz 64-bitowej wersji systemu Windows, należy również umieścić libgcc_s_dw2-1.dll w katalogu C: \ Windows \ SysWOW64 \

Upewnij nadpisanie wszelkie istniejące pliki (ale zrób kopię zapasową urządzenia oryginalny plik). Zrestartuj swój komputer.

Jeśli problem nadal występuje, spróbuj wykonać następujące czynności:

  • 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.
+10

Proszę nie zamieszczać komentarzy jako odpowiedzi tutaj. Tak nie działa sposób przepełnienia stosu. Nie zostaniesz również daleko za pomocą "u" zamiast "ty" i "cos" zamiast "ponieważ". Mówienie na czacie jest w tym przypadku szczególnie zabronione. – meagar

7

Code :: Blocks: dodaj '-static' w ustawienia-> compiler-> Linker Ustawienia-> Inne opcje linkera.

+1

To działało idealnie dla mnie w odniesieniu do "brakującej" biblioteki DLL na tytuł, jest tak szybkie i łatwe, polecam najpierw pójść na to. –

4

Po prostu przejdź do Ustawienia >> Kompilator i debugger, następnie kliknij zakładkę Ustawienia łącznika i przejdź do opcji edycji "Inne opcje linkera" i wklej: "-static-libgcc -static-libstdC++" do niej, jest nie ma opcji flagi kompilatora w opcjach Flagi kompilacji dla Code :: Blocks, więc jest to sposób na rozwiązanie tego problemu, przyjechałem tutaj również szukając rozwiązania, a ten, który pisał o "-static-libgcc -static-libstdC++" dał Właściwy pomysł, a ja w pewien sposób wyobraziłem sobie resztę przez przypadek, ale zadziałało, plik można teraz klikać spoza kodu Code :: Blocks, działa bezpośrednio z pulpitu.

1

Dodanie "-static" do innych opcji linkera rozwiązuje ten problem. Właśnie miałem ten sam problem po tym, jak przetestowałem to w innym systemie, ale nie na własną rękę, więc nawet jeśli nie zauważyłeś tego w twoim systemie rozwoju, powinieneś sprawdzić, że masz ten zestaw jeśli jesteś statycznie łączący.

Kolejna uwaga, skopiowanie biblioteki DLL do tego samego folderu, co plik wykonywalny, nie jest rozwiązaniem, ponieważ pokonuje ideę statycznego linkowania.

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

3

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

3

Udało mi się to przezwyciężyć, używając "gcc" zamiast "g ++" dla mojego kompilatora. Wiem, że to nie jest opcja dla większości ludzi, ale pomyślałem, że o tym wspomnę :)

Powiązane problemy