2012-05-02 15 views
35

Sé que esto se ha preguntado en otros lugares y ha respondido, pero estoy teniendo problemas con MS Visual Studio 2010. He desarrollado un ejecutable C++ pero si ejecuto la versión de lanzamiento en una máquina que no tiene la biblioteca de tiempo de ejecución de VC++ (es decir, msvcr100d.dll), aparece el error "el programa no puede iniciarse porque msvcr100d.dll no se encuentra en su computadora".Visual C++ ejecutable y que falta MSVCR100d.dll

Esto es extraño, por dos razones:

  • ¿Por qué es tratar de vincular con la versión de depuración de la redistribuible?
  • He intentado aplicar this fix, estableciendo la configuración de la biblioteca de tiempo de ejecución en/MT en lugar de/MD (DLL multiproceso), pero eso solo empeoró el problema (si copié manualmente msvcr100d.dll, entonces dijo que no podría encuentra msvcp110.dll).

¿Cómo puedo empaquetar la biblioteca de tiempo de ejecución con mi ejecutable para que pueda ejecutarlo en máquinas que no tienen instalado MS VC 2010 o la redistribuible?

Sé que se considera un riesgo de seguridad incluir una copia de la DLL, ya que no se actualizará nunca, pero mi objetivo es simplemente enviar este ejecutable a unos pocos amigos a corto plazo.

+3

¿Qué quiere decir mediante el uso de la '/ MT' empeoró las cosas? Eso debería eliminar la dependencia en el tiempo de ejecución de DLL. ¿Su proyecto depende de otras DLL? Pueden ser lo que depende incorrectamente del tiempo de ejecución de depuración. Una utilidad como Dependency Walker puede ayudarlo a determinar si ese es el caso: http://www.dependencywalker.com –

+0

@eli: No creo que a la gente realmente le importe mucho el riesgo de seguridad cuando le dicen que no redistribuya la DLL , ya que puedes vincular estáticamente de todos modos. Es más un problema de licencia que cualquier otra cosa. – Mehrdad

+2

@MichaelBurr Dependencia Walker confirmó que una de las DLL de las que depende mi proyecto depende de msvcr100d.dll. Resulta que DLL no se estaba construyendo en modo de lanzamiento. Gracias. – mgiuffrida

Respuesta

39

Definitivamente no debería necesitar la versión de depuración del CRT si está compilando en modo "release". Puede decir que son las versiones de depuración de los DLL porque terminan con un d.

Más al punto, la versión de depuración es no redistribuible, así que no es tan simple como "envasado" con su ejecutable, o cerrando la cremallera de los archivos DLL.

Compruebe para asegurarse de que se está compilando todos los componentes de la aplicación en modo de "liberación", y que va a asociar la versión correcta de la CRT y cualquier otra biblioteca que usa (por ejemplo, MFC, ATL , etc.)

Usted hará, por supuesto, requieren msvcr100.dll (nótese la ausencia del d sufijo) y algunos otros si no están ya instalados. Dirija a sus amigos para que descarguen el Visual C++ 2010 Redistributable (o x64), o inclúyalos automáticamente en su aplicación creando un instalador.

+0

instalando el paquete redistribuible de Microsoft Visual C++ 2010 SP1 (x86) funcionó muy bien para mí. – Joseph

+0

@ Joseph que solo debería aplicarse a la versión de lanzamiento ya que (como mencionó Cody Gray) las versiones de depuración generalmente no son redistribuibles. Si no tiene instalado MSVC2010, aún debe faltar 'msvcr100d.dll'. – andreee

1

Por lo general, la aplicación que no alcanza la .dll indica la versión que necesita - si uno no funciona, sólo tiene que descargar el Visual C++ 2010 x86 Microsoft o x64 desde este enlace:

Para OS 32 bits: Here

Para OS 64 bits: Here

2

Para mí el problema apareció en esta situación:

he instalado VS2012 y VS2010 no necesitaba más. Quería limpiar mi computadora y también eliminar los ejecutables de tiempo de ejecución de VS2010, pensando que ningún otro programa lo usaría. Luego quise probar mi DLL adjuntándola a un programa (llamémoslo programa X). Recibí el mismo mensaje de error. Pensé que hice algo mal al compilar el archivo DLL. Sin embargo, el problema real fue que adjunté la DLL al programa X, y el programa X se compiló en VS2010 con información de depuración.Es por eso que el error fue lanzado. Recopilé el programa X en VS2012, y el error desapareció.

1

Tengo el mismo error.

Me refería a una DLL VS2010 en un proyecto VS2012.

Recién compilamos la DLL en VS2012 y ahora todo está bien.

1

¡La versión de depuración de la biblioteca vC++ no debe redistribuirse!

versiones de depuración de una aplicación no son redistribuibles y depurar versiones de la biblioteca de Visual C++ DLL no son redistribuibles. Usted puede implementar versiones de depuración de aplicaciones y DLL de Visual C++ solo a sus otras computadoras, con el único propósito de depurar y probar las aplicaciones en una computadora que no tiene instalado Visual Studio . Para obtener más información, vea Redistribuir archivos de Visual C++.

Voy a ofrecer el enlace así: http://msdn.microsoft.com/en-us/library/aa985618.aspx

2

Este problema se explica en MSDN Library y como entiendo la instalación de paquete redistribuible de Microsoft puede ayudar.

Pero a veces la solución siguiente se puede utilizar (como la solución del lado del desarrollador):

En Visual Studio, abierta Project properties -> Configuration properties -> C/C++ -> Code generation y cambio de opción Runtime Library a /MT en lugar de /MD

Cuestiones relacionadas