¿Cómo puedo crear un .exe totalmente vinculado estáticamente con Visual Studio Express 2005?
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.
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.
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):
En Propiedades de configuración --> General, cambie el campo "Uso de MFC" a "Usar MFC en una biblioteca estática".
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.