Mi aplicación en C++ (VC++ 2005 Express) no se ejecuta en otros equipos!!! (solución)

Hola a todos!

Como ya he comentado en otra ocasión, estoy usando el Visual C++ 2005 Express para desarrollar un jueguecillo con OpenGL y SDL. Cuando empecé, lo estaba desarrollando con el Visual C++ 2003, pero me comentaron que la STL había mejorado en la versión 2005, y como había una versión gratuita, decidí actualizarme.

El caso es que el otro día decidí liberar una alpha para los betatesters. Y de repente algunos (no todos) me comentaron que no funcionaba. Que les daba el siguiente error:

No se pudo iniciar la aplicacion porque su configuracion es incorrecta. Reinstalar la aplicacion puede solucionar el problema.

Hmmm… Al principio pensé que debía haber algún problema con mi código. Así que empece a meter trazas y pedir logs. Tras comentarme los betatesters que no había ningún log, me di cuenta de que la aplicación, como dice el error claramente, no llegaba a iniciarse. ^_^U

Entonces me di cuenta de un pequeño detalle. El runtime de C de esta versión de C++ probablemente no lo tenían todos los usuarios. Googleando un poco, ví que los betatesters se podían instalar el paquete de distribución del runtime de C++… Pero me pareció que iba a ser un rollo para ellos tener que andar instalando nada para probar una alpha.

¿Qué hago? Si no quiero que se instalen el paquete de distribución, tampoco me voy a poner a generar un msi con la alpha del juego. Habría sido la mejor solución, pero generalmente la gente prefiere descomprimir el archivo, y ejecutar directamente, sobre todo cuando algo es no definitivo…

Finalmente, encontré la solución en los foros de microsoft. La traduzco a continuación:

1) En la máquina en la que tienes instalado Visual C++ Express, crea la siguiente carpeta y subcarpetas colgando de %PROGRAMFILES%Microsoft Visual Studio 8VC

redistx86Microsoft.VC80.CRT

2) Copia msvcr80.dll, msvcp80.dll, msvcm80.dll de:

%WINDIR%winsxsx86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_0de06acd

a:

%PROGRAMFILES%Microsoft Visual Studio 8VCredistx86Microsoft.VC80.CRT

3) En la carpeta Microsoft.VC80.CRT, crea un nuevo fichero llamado:

Microsoft.VC80.CRT.manifest

4) Dicho fichero deberá tener el siguiente contenido:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!-- Copyright © 1981-2001 Microsoft Corporation -->
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
  <noInheritable/>
  <assemblyIdentity
      type="win32"
      name="Microsoft.VC80.CRT"
      version="8.0.50608.0"
      processorArchitecture="x86"
      publicKeyToken="1fc8b3b9a1e18e3b"
    />
  <file name="msvcr80.dll"/>
  <file name="msvcp80.dll"/>
  <file name="msvcm80.dll"/>
</assembly>

Con esto hemos creado un nuevo directorio en tu instalación de Visual C++ Express que puede ser reutilizado siempre que lo necesites.

Para distribuir estos ficheros, simplemente copia la carpeta Microsoft.VC80.CRT en la carpeta de tu programa. Y eso es todo. Así que, por ejemplo, si el ejecutable de tu aplicación está en la ruta:

%PROGRAMFILES%MiAplicación

tendrás una carpeta llamada:

%PROGRAMFILES%MiAplicaciónMicrosoft.VC80.CRT

que contendrá los cuatro ficheros mencionados anteriormente (3 DLLs, y el manifiesto que has creado a mano).

No hace falta instalar nada más. Simplemente arranca tu aplicación, y se ejecutará sin problemas. No hace falta ninguna instalación específica. Simplemente basta con que tu programa de instalación cree esa subcarpeta junto con el resto de archivos que tenga tu aplicación.

NOTA:

%WINDIR% es el directorio en el que está instalado Windows. Es una variable que se puede utilizar en el cmd.exe. Normalmente es C:WINDOWS

%PROGRAMFILES% es similar, salvo que apunta a la carpeta Archivos de Programa. Lo bueno es que es independiente de idioma.

Saludos!

22 comentarios en “Mi aplicación en C++ (VC++ 2005 Express) no se ejecuta en otros equipos!!! (solución)”

  1. ¡Gracias!

    Muy interesante, y la verdad muy útil, que no sería la primera vez que alguien el día de la “demo” en ese equipo le salta ese error.

  2. En la Express no sé si estará, pero en las de pago hay una carpeta en C:Program FilesMicrosoft Visual Studio 8VCredist que contiene las DLL necesarias.

    Lo primero es que la licencia no te permite distribuir las bibliotecas DEBUG (que están en la carpeta Debug_NonRedist), por lo que el primer paso es hacer una build Release.

    Luego, tan solo tienes que soltar los ficheros que hay en C:Program Files (x86)Microsoft Visual Studio 8VCredistx86Microsoft.VC80.CRT junto a tu aplicación y listo.

    Y lo mismo en el caso de una compilación debug (C:Program Files (x86)Microsoft Visual Studio 8VCredistDebug_NonRedistx86Microsoft.VC80.DebugCRT), pero no está permitido por MS, aunque hacerse se puede hacer.

  3. Hola Rafael,

    Completamente cierto, en la versión de pago está esa estructura creada. Pero aún así puede haber alguien que no sepa para qué sirve 😉

    El problema aparece en Visual C++ 2005 Express, porque dicha carpeta no existe (cosa que no entiendo, porque te la puedes crear en un pispás). De ahí que la solución pase por primero crearte esa carpeta redist, que sigue la misma estructura que la que tiene en la versión de pago.

    En la versión de pago también tienes otras carpetas con las DLL necesarias para MFC, y otras historias…

  4. Hola soy novata muy novata en esto de visual c++ y necesito una pequeña colaboracion, no se donde se programa en el .cpp o en el .h, nunca he programado .NET y necesito un pequeño tutorial o algo les agradeceria.
    otra cosa que pena el fichero al que te refieres es un pequeño codigo?
    Gracias por su ayuda

  5. Hola trumile,

    En tu caso no es un tema de .NET, sino más bien de C++. En un resumen rápido e incompleto, en el fichero .h deberás poner la declaración de las clases, y en el .cpp la implementación de los métodos.

    Echa un vistazo aquí:

    http://www.cplusplus.com/doc/tutorial/

    Es un tutorial de C++… Una vez tengas las bases, ya podrás empezar a aprender cómo usar C++ para utilizar el framework de .NET. Pero las bases de C++ son imprescindibles, me temo.

  6. Hola,

    Lo primero, no pidas perdón. No hay preguntas tontas, sino respuestas tontas. 😉

    Lo que debes hacer es crear un nuevo fichero de texto, lo abres con el notepad, pegas el texto que aparece arriba en colorines, lo guardas, y lo renombras, poniéndole como nombre:

    Microsoft.VC80.CRT.manifest

    Ojo, asegúrate de que no te pone una extensión .txt al final, y si se la pone, se la quitas. El icono del fichero debería cambiar.

    Este fichero recién creado, lo copias a la carpeta que se indica en el artículo junto con las DLLs. Y cuando quieras distribuir la aplicación (no una versión final, sino una alpha) copias la carpeta que has creado (con sus DLLs y el fichero .manifest):

    %PROGRAMFILES%Microsoft Visual Studio 8VCredistx86Microsoft.VC80.CRT

    A la carpeta de tu aplicación que vas a distribuir. (Por ejemplo en un zip).

    Eso sí, si tu aplicación la vas a distribuir siendo una versión final, conviene que pongas como prerequisito que estén instaladas esas DLL, y distribuyes también el paquete de instalación del runtime de C++.

    Saludos,

  7. Hola soy nuevo con Visual C++ 2005 Express
    Intente compilar este codigo, pero me da error cuando presiono F5
    Este es el codigo:

    #include “stdafx.h”

    int _tmain(int argc, _TCHAR* argv[])

    {
    cout << "Hello World!"; return 0; } Me dice lo siguiente "There were build erros.would you like to continue... ?" Me pueden enviar un codigo que funcione o sino cual es la solucion? Gracias! P.D. Cualquier cosa mi correo es "dams540@gmail.com"

  8. Tengo un problema similar a este pero no se si es el mismo… deberia serlo, lo comento.
    Tengo el Visual Studio 2008, hice una aplicacion usando las librerias de SDL, y me funciono sin problemas, se lo pase a una compañera de la facultad que tiene el Visual Studio 2005, le explique como instalar las SDL y crear el proyecto desde 0, lo compilo, pero cuando lo fue a ejecutar le dio el error que aqui mencionan, luego le mande el que yo habia compilado y lo mismo le daba el error. Aqui hablan solo de las version express del 2005, pero puede estar ocurriendo esto tambien con las de pago??? Ademas mencionan que el problema ocurre en equipos sin el Visual C++ express, y ella tiene instalado el visual studio 2005… es el mismo problema? o es un problema similar? Gracias desde ya.

  9. Muy interesante compañero!!

    Por casualidad sabes si hay alguna manera de resolver el msimo problema de ejecutar un codigo .net en otra maquina pero para Visaul Basic .Net 2008??

    Muchas gracias,

  10. Hola, estoy tratando de compilar el Turbo Girl en MSVC2005 y me he encontrado con este follón del runtime. Googleo y al caer aquí digo… ¡¡ ¡ Este tío me suena !!!

    ¡Saludos!

    Chema

  11. Hola, gracias por tu solución. me imagino que se le soluciona a otros.

    En mi caso tengo instalado Windows Vista. y Visual Studio 2008 pago.

    Me sale el mismo error cuando hago los pasos mencionados pero el computador a donde llevo los archivos tiene Windows XP.

    Será que hay solución?

    Gracias Alfonso

  12. Hola
    Tengo un problema a la hora de ejecutar un programa en microsoft visual studio 2005, es el mismo problema que me da al ejecutarlo en el VC++ Express 2005.
    Pues, lo compilo, y todo bien. Pero no veo el icono de ejecutar por ningun lado, asi que le doy el debug y me dice que no encuentra el ejecutable, el .exe
    No tengo idea de lo que pasa

  13. hola,

    antes que nada me gustaría agradecer la amabilidad que usas en tus respuestas sean novatos o expertos.

    estoy cn una versión beta de un programa que necesito probar en varios pcs a la vez y justamente como tú dices, no quiero tener que ir creando msi’s innecesarios sino una solución rápida y que no deje rastro como la que tú propones.

    pero al hacer lo que dices me sigue dando el mismo problema, mi visual studio 2005 del curro ya traía esas carpetas creadas y con sus respectivas dll’s… crees que debería regenerarlas por lo que pueda ser o pq motivo no me funciona?

    gracias.

  14. Hola rubik,

    Tienes que tener cuidado. En función de la compilación que hayas realizado (debug o release) necesitarás unas dlls u otras, pero las dlls en modo debug no se pueden redistribuir.

    Por lo tanto, tienes que asegurarte que tu aplicación esté compilada en modo Release, y seguir los pasos que comento en el post.

    Y ojo!!!! Asegúrate de incluir en el directorio de tu aplicación las dlls de las librerías que estás utilizando (siempre que no sean DLLs COM. Si son DLLs COM, la cosa se complica un poco más…) Podría ser que en el equipo en el que vas a probar la aplicación no estén las librerías instaladas…

    Para usar DLLs COM sin registrar, puedes echar un vistazo aquí (en inglés):

    http://www.devx.com/vb/Article/32888/1954

    Saludos,

  15. Dejo esta explicación para los que consultaron antes y los que consulten a continuación esta página. Como bien dijo otro lector deben asegurarse de que la configuración de la solución a generar sea en modo “release” para lo cual (en visual studio 2008) van a Generar–>Administrador de configuración y ahí en “Configuración de soluciones activas” eligen “Release” y luego Generan la solución y en la carpeta correspondiente de su proyecto (con nombre “Release” (no debug”)) encontraran el ejecutable que pueden distribuir en otros equipos con los archivos que se encuentran en la carpeta muy bien indicada por otro lector con anticipación, o también pueden bajar e instalar (en la otra máquina -donde quieren ejecutar el ejecutable-) la versión redistribuíble del visual studio 2008 del sitio de Microsoft. Si bien también se puede hacer en modo debug, la forma correcta es la que les comento, ya que como muy bien se indicó, no se permite redistriuir los dll de la versión “debug” y el redistribuíble que se puede bajar del sitio de microsoft sólo sirve para la versión “release”.
    Espero les sirva.
    Salu2.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *