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


109

Mi entorno C ++ preferido actual es la edición gratuita y en gran medida 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 perturbador descubrimiento de que los agradables resultados se basaban en más suerte de la que me gustaría. Intentar ejecutar uno de estos programas en una caja XP vieja (cosecha de 2001, no escrupulosamente actualizada) me dio nada más que un desagradable mensaje "El sistema no puede ejecutar x.exe" (o similar).

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

Respuestas:


126

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

Si está utilizando otras bibliotecas, es posible que deba decirle al vinculador que ignore el CRT vinculado dinámicamente de forma explícita.


"Si está utilizando otras bibliotecas, es posible que deba decirle al vinculador que ignore el CRT vinculado dinámicamente de forma explícita". Recientemente me encontré con este problema. Estaba creando una aplicación wxWidgets, descubrí que necesitaba reconstruir las bibliotecas wxWidgets con la misma modificación de generación de código
Bill Forster

6
Man 300 caracteres no son muchos. En caso de que el comentario anterior no esté claro, el problema es que tanto sus archivos .cpp como los archivos .cpp de la biblioteca deben tener 'multiproceso' en lugar de 'dll multiproceso'; de lo contrario, podría obtener errores de enlace.
Bill Forster

Esto introduce numerosos problemas relacionados con la administración de montones con los que probablemente no quieras tener nada que ver.
Edward Strange

Para las bibliotecas CRT, VS proporciona las opciones / MD y / MT. Pero, ¿qué hay de vincular otras bibliotecas de forma estática en general, por ejemplo, libX.lib (que podría ser mi propia biblioteca o una biblioteca de terceros)?
Kiran MN

4
Yo entiendo error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MD_DynamicRelease' doesn't match value 'MT_StaticRelease'. ¿Hay algún otro lugar para cambiar el tipo de construcción? Estoy construyendo la aplicación wxWigets, muy parecida a @BillForster. Entonces, ¿tendré que reconstruir wxWidgets? ¿Cómo puedo hacer eso?
Tomáš Zato - Reincorporación a Monica

18

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 con el botón 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 en tiempo de ejecución" a "Multihilo (/ MT)"

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

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


1
Esto parece funcionar en Visual Studio 2013 con una pequeña adición: tuve que cambiar Propiedades de configuración -> General -> Conjunto de caracteres a "Usar conjunto de caracteres Unicode".
gnovice

4

He tenido este mismo problema de dependencia y también sé que puede incluir las DLL de VS 8.0 (¡solo liberar! ¡No depurar! --- y su programa también debe liberarse) en una carpeta con el nombre apropiado, en el carpeta principal con su .exe:

Cómo: implementar con 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 vinculadores 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.


1

Con respecto a la respuesta de Jared, tener Windows 2000 o mejor 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.


2
Si bien empaquetar el redistribuible parece ser la solución preferida, necesita privilegios de administrador para ejecutar el instalador redistribuible. Esa no es una opción viable si tiene usuarios que no sean administradores.
Kevin Condon
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.