¿Cómo puedo crear un .exe totalmente vinculado estáticamente con Visual Studio Express 2005?

StackOverflow https://stackoverflow.com/questions/37398

  •  09-06-2019
  •  | 
  •  

Pregunta

Mi entorno C++ preferido actualmente es la edición gratuita y excelente Microsoft Visual Studio 2005 Express.De vez en cuando he enviado archivos .exe de lanzamiento a otras personas con resultados satisfactorios.Sin embargo, recientemente hice el inquietante descubrimiento de que los resultados satisfactorios se basaban en más suerte de la que me gustaría.Al intentar ejecutar uno de estos programas en una máquina XP antigua (de 2001, no escrupulosamente actualizada) no me dio nada más que un mensaje desagradable: "El sistema no puede ejecutar x.exe" (o similar).

Algunas búsquedas en Google revelaron que con este conjunto de herramientas, incluso especificar enlaces estáticos da como resultado un hello-world.exe simple que en realidad depende de archivos .dll adicionales (msvcm80.dll, etc.).Un sistema de planificación de versiones increíblemente elaborado (¿alguien quiere archivos de manifiesto?) no permitirá que el .exe se ejecute sin exactamente las versiones .dll correctas.No quiero ni necesito estas cosas, solo quiero un .exe autónomo y antiguo que no haga nada más que operaciones Win32 con el mínimo común denominador y que se ejecute en cualquier sistema operativo Win32 antiguo.

¿Alguien sabe si es posible hacer lo que quiero hacer con mi conjunto de herramientas existente?

Gracias.

¿Fue útil?

Solución

Para el tiempo de ejecución C, vaya a la configuración del proyecto, elija C/C++ y luego "Generación de código".Cambie la configuración de 'biblioteca de tiempo de ejecución' a 'multiproceso' en lugar de 'dll multiproceso'.

Si está utilizando otras bibliotecas, es posible que deba indicarle al vinculador que ignore explícitamente el CRT vinculado dinámicamente.

Otros consejos

Mi experiencia en Visual Studio 2010 es que se necesitan dos cambios para no necesitar DLL.Desde la página de propiedades del proyecto (haga clic derecho en el nombre del proyecto en la ventana del Explorador de soluciones):

  1. En Propiedades de configuración --> General, cambie el campo "Uso de MFC" a "Usar MFC en una biblioteca estática".

  2. En Propiedades de configuración --> C/C++ --> Generación de código, cambie el campo "Biblioteca de tiempo de ejecución" a "Multiproceso (/MT)".

No estoy seguro de por qué se necesitaban ambos.Utilicé esto para eliminar una dependencia de glut32.dll.

Agregado más tarde:Al realizar estos cambios en las configuraciones, debe hacerlos en "Todas las configuraciones". Puede seleccionar esto en la parte superior de la ventana Propiedades.Si realiza el cambio solo a la configuración de depuración, no se aplicará a la configuración de versión y viceversa.

He tenido el mismo problema de dependencia y también sé que puedes incluir las DLL de VS 8.0 (¡solo versión!¡no depurar! --- y su programa también debe publicarse) en una carpeta con el nombre apropiado, en la carpeta principal con su .exe:

Cómo:Implementar usando XCopy (MSDN)

También tenga en cuenta que se garantiza que las cosas saldrán mal si necesita tener código C++ y C en el mismo .exe vinculado estáticamente porque obtendrá conflictos de vinculación que solo se pueden resolver ignorando el libXXX.lib correcto y luego vinculando dinámicamente (DLL). .

Por último, con un conjunto de herramientas diferente (VC++ 6.0), las cosas "simplemente funcionan", ya que Windows 2000 y versiones posteriores tienen instaladas las DLL correctas.

En cuanto a la respuesta de Jared, tener Windows 2000 o superior no necesariamente solucionará el problema en cuestión.La respuesta de Rob funciona, sin embargo, es posible que esta solución introduzca problemas de seguridad, ya que las actualizaciones de Windows no podrán parchear las aplicaciones creadas como tales.

En otra publicación, Nick Guerrera sugiere empaquetar Visual C++ Runtime Redistributable con sus aplicaciones, que se instala rápidamente y es independiente de Visual Studio.

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