2008-09-01 7 views
78

Mi entorno actual preferido de C++ es la edición gratuita y excelente de Microsoft Visual Studio 2005 Express. De vez en cuando, he enviado archivos .exe de lanzamiento a otras personas con resultados agradables. Sin embargo, recientemente hice el inquietante descubrimiento de que los resultados agradables se basaban en más suerte que me gustaría. Intentar ejecutar uno de estos programas en un antiguo (2001 vintage, no actualizado escrupulosamente) cuadro de XP no me dio nada más que un desagradable "El sistema no puede ejecutar x.exe" (o similar) mensaje.¿Cómo puedo hacer un .exe totalmente vinculado de forma estática con Visual Studio Express 2005?

Algunos google revelaron que con este conjunto de herramientas, incluso la especificación de enlaces estáticos da como resultado un hello-world.exe simple que realmente depende de archivos .dll adicionales (msvcm80.dll, etc.). Un sistema de elaboración de versiones increíblemente elaborado (¿alguno de los archivos de manifiesto?) No permitirá que el .exe se ejecute sin las versiones .dll correctas. No quiero ni necesito esto, solo quiero un archivo .exe autocontenido a la antigua que no haga más que las operaciones de Win32 de denominador común más bajo y se ejecute en cualquier SO viejo win32.

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

Gracias.

Respuesta

95

Para el C-runtime, 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 'multihilo' en lugar de 'dll multiproceso'.

Si está utilizando otras bibliotecas, puede que necesite decirle al vinculador que ignore explícitamente el CRT vinculado dinámicamente.

+0

"Si está utilizando otras bibliotecas, puede que necesite decirle al vinculador que ignore explícitamente el CRT vinculado dinámicamente". Recientemente me encontré con este problema. Estaba construyendo una aplicación wxWidgets, descubrí que necesitaba reconstruir las bibliotecas wxWidgets con la misma modificación de generación de código –

+6

El hombre 300 caracteres no es muchos. En caso de que el comentario anterior no esté claro, el problema es que tanto sus archivos .cpp como cualquier archivo .cpp de biblioteca deben tener 'multiproceso' en lugar de 'dll multiproceso', de lo contrario es posible que obtenga errores de enlace. –

+0

Esto presenta numerosos problemas relacionados con la gestión de heap con los que probablemente no quiera hacer nada. –

4

Tuve este mismo problema de dependencia y también sé que puede incluir los archivos DLL de VS 8.0 (¡solo versión! No depurada! --- y su programa también debe ser lanzado) en una carpeta de los apropiados nombre, en la carpeta principal con su .exe:

How to: Deploy using XCopy (MSDN)

también tenga en cuenta que las cosas están garantizados a ir mal si deben tener el código C++ y C en la misma .exe enlazado estáticamente porque obtendrá enlazador conflictos que solo pueden resolverse 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 posteriores tienen las DLL correctas instaladas.

1

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 aplicaciones creadas como tales.

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

+2

Mientras empaque la 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. –

4

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

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

  2. En Configuración Propiedades -> C/C++ -> Generación de código, cambie el campo "biblioteca de ejecución" en "Multi-roscado (/ MT)"

No

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

+0

Gracias. Salvó mi vida. :) –

Cuestiones relacionadas