Le programme ne peut pas démarrer car libgcc_s_dw2-1.dll est manquant

166

J'ai créé un programme simple en C ++ avec Code :: Blocks.

Si je l'exécute depuis Code :: Blocks, cela fonctionne correctement; mais si je l'exécute en double-cliquant sur le fichier exécutable, une fenêtre apparaît avec ce message:

Le programme ne peut pas démarrer, car libgcc_s_dw2-1.dll est absent de votre ordinateur.
Essayez de réinstaller le programme pour résoudre ce problème.

Alors quel est le problème? Que dois-je faire pour y remédier?

xRobot
la source

Réponses:

196

Je crois qu'il s'agit d'un problème de compilateur MinGW / gcc, plutôt que d'une configuration Microsoft Visual Studio.

Le libgcc_s_dw2-1.dlldevrait être dans le répertoire bin du compilateur. Vous pouvez ajouter ce répertoire à votre variable d'environnement PATH pour la liaison d'exécution, ou vous pouvez éviter le problème en ajoutant "-static-libgcc -static-libstdc ++" aux indicateurs de votre compilateur.

Si vous envisagez de distribuer l'exécutable, ce dernier est probablement le plus logique. Si vous prévoyez de l'exécuter uniquement sur votre propre machine, la modification de la variable d'environnement PATH est une option intéressante (réduit la taille de l'exécutable).

Actualisé:

Sur la base des commentaires de Greg Treleaven (voir les commentaires ci-dessous), j'ajoute des liens vers:

[Capture d'écran de Code :: Blocks "Options de construction du projet"]

[Options de lien GNU gcc]

Cette dernière discussion comprend -static-libgccet les -static-libstdc++options de l'éditeur de liens.

dur
la source
J'ai le même problème que @xRobot, et je n'ai trouvé nulle part où ajouter des éléments aux drapeaux du compilateur, j'ai donc essayé de l'ajouter à Autres options, puis aux Options de l'éditeur de liens, et le message d'erreur s'est toujours produit. Quelque chose ne va pas avec ce que je fais?
Greg Treleaven
@Greg Treleaven: Juste pour plus de clarté, vous construisez un exécutable avec Code :: Block, cela fonctionne comme prévu dans l'EDI mais signale une erreur "ne peut pas démarrer car libgcc_s_dw2-1.dll est manquant" lorsque vous essayez de l'exécuter en dehors de l'IDE. Vous avez vérifié le répertoire bin du compilateur, et oui, cette DLL est en fait là. Vous essayez de résoudre le problème en effectuant une liaison statique, qui extrait le code compilé d'une bibliothèque afin que la DLL (liaison d'exécution) ne soit pas nécessaire, mais elle ne fonctionne pas. Deux suggestions: effectuez une nouvelle génération (la modification des options peut ne pas déclencher une reconstruction) et essayez d'ajouter la variable PATH.
hardmath
@hardmath: Ne fonctionne toujours pas après avoir fait une reconstruction propre, donc je suppose que je vais devoir utiliser l'une des autres façons de résoudre ce problème. Merci pour ton aide.
Greg Treleaven
@Greg Treleaven: La raison d'essayer d'ajouter le répertoire bin du compilateur à votre PATH est de montrer (si cela fait fonctionner les choses) que l'exécutable est toujours en cours de construction pour le lien d'exécution des bibliothèques standard (DLL). Je pense que le problème est que et nous devons trouver (si vous voulez faire un lien statique du code de bibliothèque) où placer les drapeaux du compilateur.
hardmath
4
Cette discussion se poursuit (et est résolue) ici .
David C
37

Dans Eclipse, vous le trouverez sous les propriétés du projet> C / C ++ Build> Settings> MinGW C ++ Linker> Misc

Vous devez l'ajouter aux "indicateurs de l'éditeur de liens" en haut; nulle part ailleurs. Ensuite, reconstruisez simplement.

Capture d'écran des propriétés Eclipse

J'ai constaté que la liaison de ceux-ci explose statiquement la taille jusqu'à 1400 Ko, même avec des optimisations. C'est 277 Ko plus gros que la simple copie des DLL partagées. Il est également 388kb plus grand après tout UPXing. Très perdre / perdre ici. Incluez simplement les DLL car l'utilisateur final peut décider de les supprimer ou non s'il les a installées ailleurs.

TommyTom
la source
1
Existe-t-il un moyen d'éviter d'ajouter l'indicateur de l'éditeur de liens dans chaque projet nouvellement créé?
Roger Ng
Aux lecteurs: veuillez noter les options ajoutées dans l'image. Cela marche. Cela aide comme référence: orfe.princeton.edu/help/article-296
PALEN
10

Code :: Blocks: ajoutez '-static' dans settings-> compilateur-> Linker settings-> Other linker options.

user1826947
la source
1
Cela a parfaitement fonctionné pour moi en ce qui concerne la dll "manquante" par le titre, c'est tellement rapide et facile que je recommanderais d'abord d'essayer celui-ci.
Paul Connolly
Meilleure solution !
iyy0v
6

Trouvez cette dll sur votre PC et copiez-la dans le même répertoire que votre exécutable.

Dave
la source
pourquoi cela n'arrive-t-il pas avec Visual Studio?
xRobot
1
C'est également le cas, mais avec d'autres dll. Exemples, si vous manquez de msvcrt90.dll, votre projet visuel compilé ne démarre pas (cependant, il est généralement installé à l'échelle du système)
Bruce
6

Voir aussi . Cela a résolu mon problème.

Au fait, est-ce vraiment un compilerdrapeau? Peut linker- être le terme le plus approprié ici?

graisse
la source
1
+1 pour une terminologie correcte! Oui, mon "lien" vers les options de lien gcc en était une idée (pour les bibliothèques statiques).
hardmath
5

Copiez "libgcc_s_dw2-1.dll" à l'endroit où make.exe est. (Si vous utilisez Msys, copiez-le dans \ msys \ bin) Assurez-vous que le chemin d'accès à make.exe est défini dans l'environnement env. PATH (si make.exe est dans un dossier "bin", très probablement, et que vous avez msys, c'est \ msys \ bin) Compilez, rund, debug, etc. heureux.

Blizz
la source
5

Accédez à l'arborescence MinGW http sourceforge.net. Sous Accueil / MinGW / Base / gcc / Version4 (ou quelle que soit la version utilisée) / gcc-4 (version) / vous trouverez un fichier comme gcc-core-4.8.1-4-mingw32-dll.tar.lzma . Extrayez-le et allez dans le dossier bin où vous trouverez votre libgcc_s_dw2-1.dll et d'autres dll. Copiez et collez ce dont vous avez besoin dans votre répertoire bin.


la source
5

J'ai pu surmonter cela en utilisant "gcc" au lieu de "g ++" pour mon compilateur. Je sais que ce n'est pas une option pour la plupart des gens, mais j'ai pensé que je le mentionnerais comme solution de contournement :)

rogerdpack
la source
4

Ne pouvez-vous pas le mettre dans system32 ou quelque chose comme vous le faites avec d'autres fichiers dll, de sorte que chaque programme que vous essayez d'exécuter n'aura pas ce problème sur votre machine?

J'ai juste besoin du chemin où le mettre.

C'est un peu ennuyeux de le mettre dans le répertoire chaque fois que je lance un programme que je viens de créer ...

Edit: j'ai trouvé la solution:

Extrayez libgcc_s_dw2-1.dll dans un répertoire sur votre ordinateur. Nous vous recommandons de le décompresser dans le répertoire du programme qui demande libgcc_s_dw2-1.dll.

Si cela ne fonctionne pas, vous devrez extraire libgcc_s_dw2-1.dll dans votre répertoire système. Par défaut, c'est:

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

Si vous utilisez une version 64 bits de Windows, vous devez également placer libgcc_s_dw2-1.dll dans C: \ Windows \ SysWOW64 \

Assurez-vous d'écraser tous les fichiers existants (mais faites une copie de sauvegarde du fichier d'origine). Redémarrez votre ordinateur.

Si le problème persiste, essayez ce qui suit:

  • Ouvrez le menu Démarrer de Windows et sélectionnez "Exécuter ...".
  • Tapez CMD et appuyez sur Entrée (ou si vous utilisez Windows ME, tapez COMMAND)).
  • Tapez regsvr32 libgcc_s_dw2-1.dll et appuyez sur Entrée.
yossi
la source
12
Veuillez ne pas publier de commentaires comme réponses ici. Ce n'est pas ainsi que fonctionne Stack Overflow. Vous n'irez pas non plus loin en utilisant "u" au lieu de "vous" et "cos" au lieu de "parce que". Le bavardage est spécifiquement interdit ici.
meagar
4

Allez simplement dans Paramètres >> Compilateur et débogueur, puis cliquez sur l'onglet Paramètres de l'éditeur de liens et passez au contrôle d'édition "Autres options de l'éditeur de liens" et collez-y: "-static-libgcc -static-libstdc ++", il n'y a pas d'option d'indicateur du compilateur dans les options des indicateurs du compilateur pour Code :: Blocks, donc c'est la façon de résoudre ce problème, je suis également venu ici à la recherche d'une solution et le seul gars qui a posté à propos de "-static-libgcc -static-libstdc ++" a donné la bonne idée, et J'ai en quelque sorte compris le reste par accident, mais cela a fonctionné, le fichier est maintenant cliquable depuis l'extérieur de Code :: Blocks, fonctionne directement depuis le bureau.

Jack Offington
la source
3

Ajoutez le chemin d'accès à cette dll dans la variable d'environnement PATH.

Bojan Komazec
la source
pourquoi cela n'arrive-t-il pas avec Visual Studio?
xRobot
Probablement parce que le chemin de cette dll est répertorié dans les outils de VisualStudio-> Options-> Projets et solutions -> Répertoires VC ++ -> Fichiers exécutables. Visual Studio regarde ici et dans la variable d'environnement PATH lors de la recherche de chemins vers les DLL.
Bojan Komazec
2

L'inclusion de -static-libgcc sur la ligne de compilation résout le problème

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

Selon: @hardmath

Vous pouvez également, créer un alias sur votre profil [.profile] si vous êtes sur MSYS2 par exemple

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

Maintenant, votre commande GCC passe aussi par là ;-)

N'oubliez pas de redémarrer votre terminal

PYK
la source
1

Ajouter "-static" aux autres options de l'éditeur de liens résout ce problème. J'avais juste le même problème après avoir testé cela sur un autre système, mais pas sur le mien, donc même si vous ne l'avez pas remarqué sur votre système de développement, vous devriez vérifier que vous avez cet ensemble si vous liez statiquement.

Une autre note, la copie de la DLL dans le même dossier que l'exécutable n'est pas une solution car elle va à l'encontre de l'idée de liaison statique.

Une autre option consiste à utiliser la version TDM de MinGW qui résout ce problème.

Modifier la mise à jour: cela peut ne pas résoudre le problème pour tout le monde. Une autre raison que j'ai récemment découverte pour cela est lorsque vous utilisez une bibliothèque compilée par quelqu'un d'autre, dans mon cas, c'était SFML qui a été mal compilé et donc requis une DLL qui n'existait pas car elle a été compilée avec une version de MinGW différente de celle que j'ai utilisation. J'utilise une version naine, celle-ci en utilisait une autre, donc je n'avais nulle part la DLL et bien sûr, je ne la voulais pas car c'était une construction statique. La solution peut être de trouver une autre version de la bibliothèque ou de la créer vous-même.

Neil Roy
la source
0

En travaillant avec msys2, j'ai obtenu la même erreur en essayant d'exécuter la version finale de mon projet dans un environnement de débogage. La solution à mon problème est évidente: utilisez un exécutable avec des symboles de débogage.

Rubén Pozo
la source
0

Dans CodeBlocks, vous pouvez aller dans Paramètres ... Compilateur ... et choisir 1) les deux éléments dans la case bleue ou 2) le seul élément dans la case verte

codeblocks paramètres du compilateur

raddevus
la source