Pregunta

Mi programa C(++), escrito y compilado usando Visual C(++)/Visual Studio, funciona bien en mi propia máquina, pero se niega a ejecutarse en otra máquina.El mensaje de error que recibo es "Esta aplicación no pudo iniciarse porque la configuración de la aplicación es incorrecta.Reinstalar la aplicación podría resolver el problema."

¿Fue útil?

Solución

Si escribe un programa C++, se vincula dinámicamente a la biblioteca C Runtime, o CRT para abreviar.Esta biblioteca contiene su printf, su malloc, su strtok, etcétera.La biblioteca está contenida en el archivo llamado MSVCR80.DLL.Este archivo no está instalado de forma predeterminada en un sistema Windows, por lo que la aplicación no se puede ejecutar.

¿La solución?Instale la DLL en la máquina de destino a través de VCREDIST.EXE (el paquete redistribuible de Visual C++) o vincúlela al CRT estáticamente (conecte el código real para las funciones utilizadas directamente en su EXE).

Distribuir e instalar VCREDIST junto con una aplicación simple es un dolor de cabeza, así que opté por la segunda opción:vinculación estática.Es realmente fácil:vaya a las propiedades de su proyecto, despliegue C/C++, haga clic en Generación de código y configure la Biblioteca de tiempo de ejecución en una de las opciones que no sean DLL.Eso es todo al respecto.

Otros consejos

El problema aquí es que falta una dependencia de DLL, como CRT (C Runtime Library).Una buena herramienta para diagnosticar este tipo de problemas es Dependency Walker (depends.exe), que puede encontrar aquí:

http://www.dependencywalker.com/

Debe ejecutar este programa en la computadora que genera el mensaje de error que publicó y usarlo para abrir el archivo ejecutable que genera este error.Dependency Walker indicará rápida y gráficamente cualquier archivo DLL que sea necesario pero que no esté disponible en la máquina.

Es muy probable que pierda las bibliotecas de tiempo de ejecución de Visual Studio (CRT, entre otras). Puede deshacerse de esas dependencias (enlazar estáticamente) o instalar los paquetes de redistribución de VC en la computadora de destino.

Dependiendo de la versión de Visual C++ que utilices, tendrás que instalar diferentes paquetes:

VisualC++2005

Visual C++ 2005 SP1

VisualC++2008

Advertencia :esos paquetes solo contienen versiones de lanzamiento de las bibliotecas; si desea poder distribuir compilaciones de depuración de su aplicación, deberá encargarse usted mismo de la DLL requerida.

Es mucho más sencillo vincularse estáticamente al tiempo de ejecución.

c++ -> Generación de código -> Biblioteca de tiempo de ejecución y seleccione "multiproceso /MT"

Sin embargo, esto hace que su ejecutable sea un par de cientos de KB más grande.Esto podría ser un problema si está instalando una gran cantidad de programas pequeños, ya que cada uno tendrá su propia copia del tiempo de ejecución.La respuesta es crear un instalador.

Nuevo proyecto -> "configuración e implementación" -> "proyecto de configuración"

Cargue el resultado de sus proyectos de aplicación (definidos usando la versión DLL del tiempo de ejecución) en el proyecto del instalador y compílelo.La dependencia de la DLL en tiempo de ejecución se notará, se incluirá en el paquete de instalación y se instalará de forma ordenada y discreta en el lugar correcto de la máquina de destino.

El paquete VC Redist correcto para usted es parte de su instalación de Visual Studio.Para VC 8, puede encontrarlo aquí:

\Program Files\Microsoft Visual Studio 8\SDK\v2.0\BootStrapper\Packages\vcredist_x86

SOLUCIÓN POSIBLE........

EDITAR:(eliminé la mayor parte de mi publicación) Larga historia, tenía problemas similares, hacía que los mensajes de "configuración de la aplicación incorrecta", etc.Depends.exe solo encontraba ieshims.dll y wer.dll como posibles problemas, pero este no es el problema.Terminé usando la opción de compilación multiproceso (/mt).Sin embargo, lo que HA funcionado, como solución viable, es crear un instalador con InstallShield.Seleccioné varios módulos de combinación en installshield builder y esto parece haber solucionado mi problema.Los módulos seleccionados fueron:VC++ 9.0 CRT, VC++ 9.0 DEBUG CRT y el módulo de combinación CRT WinSXS MSM.Estoy bastante seguro de que es el módulo de combinación de WinSXS el que lo solucionó.

CRT DE DEPURACIÓN:Me di cuenta en alguna parte de que (no importa cuánto lo intenté y obviamente fallé hasta ahora), mi versión de lanzamiento todavía dependía del DEBUG CRT.Si este sigue siendo el caso, el módulo de combinación InstallShield ahora ha colocado la carpeta DEBUG CRT en mi carpeta WinSXS :) Siendo algo novato con VC++, supongo que esto normalmente se usaría para distribuir versiones de depuración de sus programas a otras personas.Para probar si esto es lo que solucionó mi problema, eliminé la carpeta DEBUG CRT de la carpeta WinSXS y la aplicación aún funcionó.(A menos que todavía se esté ejecutando algo en segundo plano, etc., no me interesa mucho)

De todos modos, esto hizo que todo funcionara para mí en una máquina XP SP3 completamente actualizada, y también en una máquina VMWare XP SP3 con lo básico (.net 3.5 y VC++ 2008 RTM básicamente), y también en la máquina XP de un compañero donde anteriormente no estaba funcionando.

Así que prueba estas cosas, puede que tengas algo de suerte.

Lo primero que debes usar

#define _BIND_TO_CURRENT_VCLIBS_VERSION 1

o agregar _BIND_TO_CURRENT_VCLIBS_VERSION=1 a las directivas del preprocesador.

El problema está relacionado con el enlace y los tipos de manifiesto, puede encontrar más http://www.nuonsoft.com/blog/2008/10/29/binding-to-the-most-recent-visual-studio-libraries/

Al hacer esto, su aplicación se ejecutará con una gama más amplia de versiones de bibliotecas de tiempo de ejecución.

Muchas veces este error es el resultado de intentar ejecutar la versión de depuración de una aplicación que utiliza .NET.Dado que el paquete redistribuible .NET no incluye las versiones de depuración de los archivos DLL que se instalan con Visual Studio, su aplicación a menudo obtendrá este error cuando la ejecute en cualquier otra máquina que no tenga Visual Studio instalado.Si aún no lo ha hecho, intente crear una versión de lanzamiento de su aplicación y vea si funciona.

Tenga en cuenta también que si cambia al tiempo de ejecución estático, tendrá que hacer lo mismo para MFC si su aplicación usa MFC.Esas configuraciones están en propiedades->Configuración/General

Me encontré con este problema y pude solucionarlo de forma muy sencilla.

Visual Studio le ofrece la opción (activada de forma predeterminada) de crear un manifiesto para cada compilación.

El manifiesto se colocó en la carpeta de lanzamiento, pero era una carpeta de lanzamiento diferente a la del exe.

Incluso cuando se usaban las utilidades de configuración, no estaba empaquetado.

Deberías buscar un nombre de archivo similar a myprogram.exe.indermediate.manifest

Si está en la misma carpeta que el exe (y tiene todos los dlls), debería ejecutarse

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top