Das Programm kann nicht gestartet werden, da libgcc_s_dw2-1.dll fehlt

166

Ich habe ein einfaches Programm in C ++ mit Code :: Blocks erstellt.

Wenn ich es über Code :: Blocks ausführe, funktioniert es ordnungsgemäß. Wenn ich es jedoch durch Doppelklicken auf die ausführbare Datei ausführe, wird ein Fenster mit der folgenden Meldung angezeigt:

Das Programm kann nicht gestartet werden, da libgcc_s_dw2-1.dll auf Ihrem Computer fehlt.
Versuchen Sie, das Programm neu zu installieren, um dieses Problem zu beheben.

Was ist also das Problem? Was muss ich tun, um das Problem zu beheben?

xRobot
quelle

Antworten:

196

Ich glaube, dies ist eher ein MinGW / gcc-Compiler-Problem als ein Microsoft Visual Studio-Setup.

Das libgcc_s_dw2-1.dllsollte sich im bin-Verzeichnis des Compilers befinden. Sie können dieses Verzeichnis zur Laufzeitverknüpfung zu Ihrer Umgebungsvariablen PATH hinzufügen oder das Problem vermeiden, indem Sie Ihren Compiler-Flags "-static-libgcc -static-libstdc ++" hinzufügen.

Wenn Sie die ausführbare Datei verteilen möchten, ist letztere wahrscheinlich am sinnvollsten. Wenn Sie es nur auf Ihrem eigenen Computer ausführen möchten, ist das Ändern der Umgebungsvariablen PATH eine attraktive Option (reduziert die Größe der ausführbaren Datei).

Aktualisiert:

Aufgrund des Feedbacks von Greg Treleaven (siehe Kommentare unten) füge ich Links hinzu zu:

[Screenshot von Code :: Blocks "Project Build Options"]

[GNU gcc Link Optionen]

Die letztere Diskussion beinhaltet -static-libgccund -static-libstdc++Linker-Optionen.

Hardmath
quelle
Ich habe das gleiche Problem wie @xRobot und konnte nirgendwo etwas zu Compiler-Flags hinzufügen. Deshalb habe ich versucht, es zu anderen Optionen, dann zu Linker-Optionen hinzuzufügen, und die Fehlermeldung ist weiterhin aufgetreten. Stimmt etwas nicht mit dem, was ich tue?
Greg Treleaven
@ Greg Treleaven: Nur aus Gründen der Übersichtlichkeit erstellen Sie eine ausführbare Datei mit Code :: Block. Sie funktioniert wie erwartet in der IDE, meldet jedoch den Fehler "Kann nicht gestartet werden, weil libgcc_s_dw2-1.dll fehlt", wenn Sie versuchen, sie auszuführen außerhalb der IDE. Sie haben das bin-Verzeichnis des Compilers überprüft, und ja, diese DLL ist tatsächlich vorhanden. Sie versuchen, das Problem durch eine statische Verknüpfung zu beheben, bei der kompilierter Code aus einer Bibliothek abgerufen wird, sodass die DLL (Laufzeitverknüpfung) nicht benötigt wird, aber nicht funktioniert. Zwei Vorschläge: Führen Sie einen sauberen Build durch (das Ändern von Optionen löst möglicherweise keine Neuerstellung aus), und versuchen Sie, die Variable PATH hinzuzufügen.
Hardmath
@hardmath: Funktioniert immer noch nicht, nachdem ich einen sauberen Wiederaufbau durchgeführt habe, also muss ich wohl eine der anderen Möglichkeiten verwenden, um dies zu beheben. Danke fürs Helfen.
Greg Treleaven
@ Greg Treleaven: Der Grund für den Versuch, das bin-Verzeichnis des Compilers zu Ihrem PATH hinzuzufügen, besteht darin, zu zeigen (wenn dies funktioniert), dass die ausführbare Datei noch für die Laufzeitverknüpfung der Standardbibliotheken (DLLs) erstellt wird. Ich denke, das Problem ist das und wir müssen herausfinden (wenn Sie eine statische Verknüpfung des Bibliothekscodes vornehmen möchten), wo die Compiler-Flags platziert werden sollen.
Hardmath
4
Diese Diskussion geht weiter (und gelöst) hier .
David C
37

In Eclipse finden Sie es unter den Projekteigenschaften> C / C ++ Build> Einstellungen> MinGW C ++ Linker> Sonstiges

Sie müssen es zu den "Linker-Flags" oben hinzufügen. nirgendwo sonst. Dann einfach wieder aufbauen.

Screenshot der Eclipse-Eigenschaften

Ich habe festgestellt, dass das Verknüpfen dieser statisch die Größe selbst bei Optimierungen auf bis zu 1.400 KB explodiert. Es ist 277 KB größer als nur das Kopieren über die gemeinsam genutzten DLLs. Es ist auch 388kb größer, nachdem alles UPXing. Sehr verlieren / verlieren hier. Fügen Sie einfach die DLLs hinzu, da der Endbenutzer entscheiden kann, ob er sie löschen möchte oder nicht, wenn er sie an anderer Stelle installiert hat.

TommyTom
quelle
1
Gibt es eine Möglichkeit, das Hinzufügen des Linker-Flags in jedem neu erstellten Projekt zu vermeiden?
Roger Ng
An die Leser: Bitte beachten Sie die im Bild hinzugefügten Optionen. Das funktioniert. Dies hilft als Referenz: orfe.princeton.edu/help/article-296
PALEN
10

Code :: Blocks: Fügen Sie '-static' in den Einstellungen-> Compiler-> Linker-Einstellungen-> Andere Linker-Optionen hinzu.

user1826947
quelle
1
Dies funktionierte perfekt für mich in Bezug auf die "fehlende" DLL pro Titel. Es ist so schnell und einfach, dass ich empfehlen würde, diese zuerst auszuprobieren.
Paul Connolly
Beste Lösung !
iyy0v
6

Suchen Sie diese DLL auf Ihrem PC und kopieren Sie sie in dasselbe Verzeichnis, in dem sich Ihre ausführbare Datei befindet.

Dave
quelle
Warum passiert das nicht mit Visual Studio?
xRobot
1
Es tut es auch, aber mit anderen DLLs. Beispiele: Wenn Ihnen msvcrt90.dll fehlt, wird Ihr visuell kompiliertes Projekt nicht gestartet (normalerweise wird es jedoch systemweit installiert)
Bruce
6

Siehe auch . Es hat mein Problem gelöst.

Übrigens, ist es definitiv compilerFlagge? Vielleicht linkerist der passendere Begriff hier?

Fett
quelle
1
+1 für korrekte Terminologie! Ja, mein "Link" zu den gcc-Link-Optionen war eine Ahnung davon (für die statischen Bibliotheken).
Hardmath
5

Kopieren Sie "libgcc_s_dw2-1.dll" in die Datei make.exe. (Wenn Sie Msys verwenden, kopieren Sie es nach \ msys \ bin.) Stellen Sie sicher, dass der Pfad zu make.exe in der Umgebung festgelegt ist. PATH (wenn sich make.exe höchstwahrscheinlich in einem Ordner "bin" befindet und Sie msys haben, ist es \ msys \ bin) Kompilieren, runden, debuggen usw. glücklich.

Blizz
quelle
5

Wechseln Sie zum Baum MinGW http sourceforge.net. Unter Home / MinGW / Base / gcc / Version4 (oder welcher Version auch immer) / gcc-4 (Version) / finden Sie eine Datei wie gcc-core-4.8.1-4-mingw32-dll.tar.lzma . Extrahieren Sie es und gehen Sie in den Ordner bin, in dem Sie Ihre libgcc_s_dw2-1.dll und andere DLLs finden. Kopieren Sie das, was Sie benötigen, und fügen Sie es in Ihr bin-Verzeichnis ein.


quelle
5

Ich konnte dies überwinden, indem ich "gcc" anstelle von "g ++" für meinen Compiler verwendete. Ich weiß, dass dies für die meisten Menschen keine Option ist, dachte aber, ich würde es als Problemumgehungsoption erwähnen :)

Rogerdpack
quelle
4

Können Sie es nicht in system32 oder so etwas wie mit anderen DLL-Dateien einfügen, damit nicht jedes Programm, das Sie ausführen möchten, dieses Problem auf Ihrem Computer hat?

Ich brauche nur den Weg, wo ich es hinstellen soll.

Es ist irgendwie ärgerlich, es jedes Mal in das Verzeichnis zu stellen, wenn ich ein Programm starte, das ich gerade erstellt habe ...

Edit: Ich habe die Lösung gefunden:

Extrahieren Sie libgcc_s_dw2-1.dll an einen Speicherort auf Ihrem Computer. Wir empfehlen Ihnen, es in das Verzeichnis des Programms zu entpacken, das libgcc_s_dw2-1.dll anfordert.

Wenn dies nicht funktioniert, müssen Sie libgcc_s_dw2-1.dll in Ihr Systemverzeichnis extrahieren. Standardmäßig ist dies:

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

Wenn Sie eine 64-Bit-Version von Windows verwenden, sollten Sie libgcc_s_dw2-1.dll auch in C: \ Windows \ SysWOW64 \ platzieren

Stellen Sie sicher, dass alle vorhandenen Dateien überschrieben werden (erstellen Sie jedoch eine Sicherungskopie der Originaldatei). Starte deinen Computer neu.

Wenn das Problem weiterhin auftritt, versuchen Sie Folgendes:

  • Öffnen Sie das Windows-Startmenü und wählen Sie "Ausführen ...".
  • Geben Sie CMD ein und drücken Sie die Eingabetaste (oder wenn Sie Windows ME verwenden, geben Sie COMMAND ein).
  • Geben Sie regsvr32 libgcc_s_dw2-1.dll ein und drücken Sie die Eingabetaste.
Yossi
quelle
12
Bitte posten Sie hier keine Kommentare als Antworten. So funktioniert Stack Overflow nicht. Sie werden auch nicht weit kommen, wenn Sie "u" anstelle von "Sie" und "cos" anstelle von "weil" verwenden. Chat Speak ist hier ausdrücklich nicht erlaubt.
Meagar
4

Gehen Sie einfach zu Einstellungen >> Compiler und Debugger, klicken Sie auf die Registerkarte Linker-Einstellungen und wechseln Sie zum Bearbeitungssteuerelement "Andere Linker-Optionen" und fügen Sie Folgendes ein: "-static-libgcc -static-libstdc ++". Es gibt keine Compiler-Flag-Option In den Compiler Flags-Optionen für Code :: Blocks, um dieses Problem zu lösen, habe ich auch nach einer Lösung gesucht, und derjenige, der über "-static-libgcc -static-libstdc ++" gepostet hat, hat die richtige Idee und Ich habe den Rest aus Versehen herausgefunden, aber es hat funktioniert. Die Datei kann jetzt von außerhalb von Code :: Blocks angeklickt werden und funktioniert direkt vom Desktop aus.

Jack Offington
quelle
3

Fügen Sie der Umgebungsvariablen PATH einen Pfad zu dieser DLL hinzu.

Bojan Komazec
quelle
Warum passiert das nicht mit Visual Studio?
xRobot
Wahrscheinlich, weil der Pfad zu dieser DLL unter VisualStudios Tools-> Optionen-> Projekte und Lösungen -> VC ++ - Verzeichnisse -> Ausführbare Dateien aufgeführt ist. Visual Studio sucht hier und in der Umgebungsvariablen PATH, wenn nach Pfaden zu DLLs gesucht wird.
Bojan Komazec
2

Einschließlich -static-libgcc auf der Kompilierung Linie, löst das Problem

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

Laut: @hardmath

Sie können auch einen Alias in Ihrem Profil [.profile] erstellen, wenn Sie beispielsweise MSYS2 verwenden

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

Jetzt geht auch dein GCC-Befehl durch ;-)

Denken Sie daran, Ihr Terminal neu zu starten

PYK
quelle
1

Das Hinzufügen von "-static" zu anderen Linkeroptionen löst dieses Problem. Ich hatte nur das gleiche Problem, nachdem ich dies auf einem anderen System getestet hatte, aber nicht auf meinem eigenen. Selbst wenn Sie dies auf Ihrem Entwicklungssystem nicht bemerkt haben, sollten Sie überprüfen, ob Sie dieses Set haben, wenn Sie statisch verknüpfen.

Ein weiterer Hinweis: Das Kopieren der DLL in denselben Ordner wie die ausführbare Datei ist keine Lösung, da sie die Idee der statischen Verknüpfung zunichte macht.

Eine andere Möglichkeit ist die Verwendung der TDM-Version von MinGW, die dieses Problem löst.

Update bearbeiten: Dies löst das Problem möglicherweise nicht für alle. Ein weiterer Grund, den ich kürzlich dafür entdeckt habe, ist die Verwendung einer von jemand anderem kompilierten Bibliothek. In meinem Fall wurde SFML nicht ordnungsgemäß kompiliert und erforderte daher eine DLL, die nicht vorhanden war, da sie mit einer anderen Version von MinGW kompiliert wurde als ich verwenden. Ich benutze einen Zwergen-Build, dieser hat einen anderen verwendet, also hatte ich die DLL nirgendwo und natürlich wollte ich sie nicht, da es sich um einen statischen Build handelte. Die Lösung kann darin bestehen, einen anderen Build der Bibliothek zu finden oder ihn selbst zu erstellen.

Neil Roy
quelle
0

Bei der Arbeit mit msys2 ist beim Versuch, die Release-Version meines Projekts in einer Debug-Umgebung auszuführen, derselbe Fehler aufgetreten. Die Lösung für mein Problem liegt auf der Hand: Verwenden Sie eine ausführbare Datei mit Debug-Symbolen.

Rubén Pozo
quelle
0

In CodeBlocks können Sie zu Einstellungen ... Compiler ... gehen und entweder 1) die beiden Elemente im blauen Feld oder 2) das eine Element im grünen Feld auswählen

Codeblöcke Compiler-Einstellungen

Raddevus
quelle