El programa no puede iniciarse porque falta libgcc_s_dw2-1.dll

166

He creado un programa simple en C ++ con Code :: Blocks.

Si lo ejecuto desde Code :: Blocks, funciona correctamente; pero si lo ejecuto haciendo doble clic en el archivo ejecutable, aparece una ventana con este mensaje:

El programa no puede iniciarse porque falta libgcc_s_dw2-1.dll en su computadora.
Intente reinstalar el programa para solucionar este problema.

¿Entonces, cuál es el problema? ¿Qué tengo que hacer para arreglarlo?

xRobot
fuente

Respuestas:

196

Creo que este es un problema del compilador MinGW / gcc, en lugar de una configuración de Microsoft Visual Studio.

El libgcc_s_dw2-1.dlldebe estar en el directorio bin del compilador. Puede agregar este directorio a su variable de entorno PATH para vinculación en tiempo de ejecución, o puede evitar el problema agregando "-static-libgcc -static-libstdc ++" a sus indicadores de compilación.

Si planea distribuir el ejecutable, este último probablemente tenga más sentido. Si solo planea ejecutarlo en su propia máquina, el cambio de la variable de entorno PATH es una opción atractiva (mantiene bajo el tamaño del ejecutable).

Actualizado:

Según los comentarios de Greg Treleaven (ver comentarios a continuación), agrego enlaces a:

[Captura de pantalla de Code :: Blocks "Project build options"]

[Opciones de enlace GNU gcc]

La última discusión incluye -static-libgccy -static-libstdc++opciones de enlace.

hardmath
fuente
Tengo el mismo problema que @xRobot, y no pude encontrar ningún lugar para agregar cosas a los indicadores del compilador, así que traté de agregarlo a Otras opciones, luego a Opciones del vinculador, y el mensaje de error aún apareció. ¿Hay algo malo con lo que estoy haciendo?
Greg Treleaven
@ Greg Treleaven: solo por claridad, está creando un ejecutable con Code :: Block, funciona como se esperaba dentro del IDE pero informa un error "no se puede iniciar porque falta libgcc_s_dw2-1.dll" cuando intenta ejecutarlo fuera del IDE. Verificó el directorio bin del compilador, y sí, esta DLL está de hecho allí. Está tratando de solucionar el problema haciendo un enlace estático, que extrae el código compilado de una biblioteca, por lo que no se necesita la DLL (enlace de tiempo de ejecución), pero no funciona. Dos sugerencias: haga una compilación limpia (cambiar las opciones puede no activar una reconstrucción) e intente agregar la variable PATH.
hardmath
@hardmath: Todavía no funciona después de hacer una reconstrucción limpia, así que supongo que tendré que usar una de las otras formas de solucionar esto. Gracias por ayudar.
Greg Treleaven
@ Greg Treleaven: La razón para intentar agregar el directorio bin del compilador a su RUTA es mostrar (si eso hace que las cosas funcionen) que el ejecutable todavía se está construyendo para el enlace en tiempo de ejecución de las bibliotecas estándar (DLL). Estoy pensando que el problema es ese y tenemos que encontrar (si desea hacer un enlace estático del código de la biblioteca) dónde colocar los indicadores del compilador.
hardmath
44
Esta discusión continúa (y se resuelve) aquí .
David C
37

En Eclipse, lo encontrará en las propiedades del proyecto> C / C ++ Build> Configuración> MinGW C ++ Linker> Misc

Debe agregarlo a las "banderas de enlace" en la parte superior; en ningún otro lugar. Entonces solo reconstruir.

Captura de pantalla de propiedades de Eclipse

He descubierto que vincularlos explota estáticamente el tamaño de hasta 1.400 kb incluso con optimizaciones. Es 277kb más grande en comparación con solo copiar sobre las DLL compartidas. También es 388kb más grande después de UPXing todo. Muy perder / perder aquí. Simplemente incluya los archivos DLL ya que el usuario final puede decidir eliminarlos o no si los tiene instalados en otro lugar.

TommyTom
fuente
1
¿Hay alguna manera de evitar agregar la bandera de enlace en cada proyecto recién creado?
Roger Ng
A los lectores: tenga en cuenta las opciones agregadas en la imagen. Esto funciona. Esto ayuda como referencia: orfe.princeton.edu/help/article-296
PALEN
10

Código :: Bloques: agregue '-static' en configuración-> compilador-> Configuración de enlazador-> Otras opciones de enlazador.

usuario1826947
fuente
1
Esto funcionó perfectamente para mí con respecto a la dll "faltante" por título, es tan rápido y fácil, que recomendaría probarlo primero.
Paul Connolly
Mejor solución !
iyy0v
6

Busque ese archivo DLL en su PC y cópielo en el mismo directorio en el que se encuentra su ejecutable.

Dave
fuente
¿Por qué no sucede esto con Visual Studio?
xRobot
1
También lo hace, pero con otros dlls. Ejemplos, si carece de msvcrt90.dll, su proyecto visual compilado no se iniciará (aunque generalmente está instalado en todo el sistema)
Bruce
6

Ver también . Resolvió mi problema.

Por cierto, ¿es definitivamente compilerbandera? Tal vez linkeres el término más adecuado aquí?

grasa
fuente
1
+1 para la terminología correcta! Sí, mi "enlace" a las opciones de enlace gcc fue un indicio de eso (para las bibliotecas estáticas).
hardmath
5

Copie "libgcc_s_dw2-1.dll" en el lugar donde make.exe es. (Si está utilizando Msys, cópielo en \ msys \ bin) Asegúrese de que la ruta a make.exe esté configurada en el entorno. RUTA (si make.exe está en una carpeta "bin", muy probablemente, y tiene msys, es \ msys \ bin) Compilar, rund, depurar, etc. feliz.

Blizz
fuente
5

Vaya al árbol MinGW http sourceforge.net. En Inicio / MinGW / Base / gcc / Version4 (o cualquier versión que se use) / gcc-4 (versión) / encontrará un archivo como gcc-core-4.8.1-4-mingw32-dll.tar.lzma . Extraiga y vaya a la carpeta bin donde encontrará su libgcc_s_dw2-1.dll y otros dll. Copie y pegue lo que necesita en su directorio bin.


fuente
5

Pude superar esto usando "gcc" en lugar de "g ++" para mi compilador. Sé que esta no es una opción para la mayoría de las personas, pero pensé en mencionarla como una opción alternativa :)

rogerdpack
fuente
4

¿No puede ponerlo en system32 o algo así como lo hace con otros archivos dll, para que cada programa que intente ejecutar no tenga ese problema en su máquina?

Solo necesito el camino donde ponerlo.

Es un poco molesto ponerlo en el directorio cada vez que ejecuto un programa que acabo de construir ...

Editar: encontré la solución:

Extraiga libgcc_s_dw2-1.dll a una ubicación en su computadora. Le recomendamos descomprimirlo en el directorio del programa que solicita libgcc_s_dw2-1.dll.

Si eso no funciona, deberá extraer libgcc_s_dw2-1.dll al directorio de su sistema. Por defecto, esto es:

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

Si utiliza una versión de Windows de 64 bits, también debe colocar libgcc_s_dw2-1.dll en C: \ Windows \ SysWOW64 \

Asegúrese de sobrescribir cualquier archivo existente (pero haga una copia de respaldo del archivo original). Reinicie su computadora.

Si el problema persiste, intente lo siguiente:

  • Abra el menú Inicio de Windows y seleccione "Ejecutar ...".
  • Escribe CMD y presiona Enter (o si utilizas Windows ME, escribe COMMAND)).
  • Escriba regsvr32 libgcc_s_dw2-1.dll y presione Entrar.
yossi
fuente
12
No publique comentarios como respuestas aquí. Así no es como funciona Stack Overflow. Tampoco llegarás lejos usando "u" en lugar de "tú" y "cos" en lugar de "porque". Chat hablar está específicamente prohibido aquí.
Meagar
4

Simplemente vaya a Configuración >> Compilador y depurador, luego haga clic en la pestaña Configuración del vinculador y vaya al control de edición "Otras opciones del vinculador" y pegue: "-static-libgcc -static-libstdc ++", no hay ninguna opción de indicador del compilador en las opciones de Compiler Flags para Code :: Blocks, así que esa es la forma de resolver ese problema, vine aquí buscando una solución también y el tipo que publicó sobre "-static-libgcc -static-libstdc ++" dio la idea correcta, y Me di cuenta del resto por accidente, pero funcionó, ahora se puede hacer clic en el archivo desde fuera de Code :: Blocks, funciona directamente desde el escritorio.

Jack Offington
fuente
3

Agregue la ruta a ese dll en la variable de entorno PATH.

Bojan Komazec
fuente
¿Por qué no sucede esto con Visual Studio?
xRobot
Probablemente porque la ruta a ese dll está listada en las Herramientas de VisualStudio-> Opciones-> Proyectos y Soluciones -> Directorios VC ++ -> Archivos ejecutables. Visual Studio mira aquí y en la variable de entorno PATH cuando busca rutas a dlls.
Bojan Komazec
2

Incluyendo -static-libgcc en la línea de compilación, resuelve el problema

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

De acuerdo con: @hardmath

También puede crear un alias en su perfil [.profile] si está en MSYS2, por ejemplo

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

Ahora su comando GCC también pasa ;-)

Recuerda reiniciar tu Terminal

PYK
fuente
1

Agregar "-static" a otras opciones de enlazador resuelve este problema. Estaba teniendo el mismo problema después de probar esto en otro sistema, pero no por mi cuenta, por lo que incluso si no lo ha notado en su sistema de desarrollo, debe verificar que tenga este conjunto si está vinculando estáticamente.

Otra nota, copiar la DLL en la misma carpeta que el ejecutable no es una solución, ya que anula la idea de vincular estáticamente.

Otra opción es usar la versión TDM de MinGW que resuelve este problema.

Edición de actualización: esto puede no resolver el problema para todos. Otra razón que descubrí recientemente para esto es cuando usa una biblioteca compilada por otra persona, en mi caso fue SFML que se compiló incorrectamente y, por lo tanto, requería una DLL que no existía, ya que se compiló con una versión diferente de MinGW de la que yo utilizar. Utilizo una compilación enana, esta usó otra, así que no tenía la DLL en ningún lado y, por supuesto, no la quería, ya que era una compilación estática. La solución puede ser encontrar otra compilación de la biblioteca o compilarla usted mismo.

Neil Roy
fuente
0

Al trabajar con msys2, obtuve el mismo error al intentar ejecutar la versión de lanzamiento de mi proyecto en un entorno de depuración. La solución para mi problema es obvia: usar ejecutable con símbolos de depuración.

Rubén Pozo
fuente
0

En CodeBlocks puede ir a Configuración ... Compilador ... y elegir 1) los dos elementos en el cuadro azul o 2) el único elemento en el cuadro verde

configuración del compilador de bloques de código

raddevus
fuente