2011-03-02 12 views
8

Tengo una aplicación de C++ originalmente escrito con Visual Studio 6.0Visual Studio 2010 generó más grande el tamaño del ejecutable

La aplicación es estándar y API Win32 cruda, sin MFC (* Editar 2), sin .NET, enlazados estáticamente , ejecutable multiproceso.

he migrado a través de todas las versiones de Visual Studio hasta 2010 (en la actualidad) y nunca he tenido ningún problema hasta ahora:

Se compila y funciona perfectamente con VS2010 pero el tamaño del ejecutable generado es de cuatro (4) veces ¡más grande!

He intentado todas las opciones que conozco (optimizaciones, eliminar información de depuración, etc.) sin resultados. De acuerdo, soy nuevo en VS2010, pero no en Visual Studio.

¿Alguien ha encontrado este problema? De nuevo: NO estoy usando ningún framework, es una aplicación Win32 sin conexión, estática, sin DLL, sin ODBC, sin red, no .NET

Espero ver mis ejecutables pequeños una vez más, gracias por cualquier entrada.

  • Edición 1: Tamaño original = 626KB (VS6.0, VS2008) hinchado size = 2.013KB (VS2010)

  • Edición 2: Después de algunas investigaciones y vertederos, descubrí un escondido referencia a MFC. Originalmente dije que NO usaba MFC, pero lo hace.

+1

Probablemente sea la conexión estáticamente vinculada o quizás una configuración de enlazador modificada en VS2010 para generar secciones más grandes de forma predeterminada para un mejor almacenamiento en caché o algo así. ¿De qué orden de magnitud estamos hablando aquí - de 4K a 16K? ¿De 64K a 256K? 1MB a 4MB? – Rup

+0

¿Qué significa 4 veces más grande? ¿Megabyte? Cinco megabytes? –

+0

He editado la pregunta para incluir tamaños de muestra, esto le sucede a todas mis aplicaciones. – Migs

Respuesta

2

El aumento en el tamaño puede deberse a cambios en el MFC. Here es una solución y el here es una solución del mismo autor que reduce el tamaño del ejecutable a regiones donde estaba con 2008. La solución implica editar copias de archivos fuente MFC, un proceso que no todos pueden estar contentos, y que debe repetirse después de cada actualización, por ejemplo después de instalar un paquete de servicio de Visual Studio.

Actualización:

Parece que el PO no utiliza MFC, por lo que estos podrían ser dos temas diferentes.He experimentado el aumento de tamaño, pero desafortunadamente no puedo decir si fue causado por MFC o no, ya que mi proyecto está vinculado estáticamente al MFC.

+0

Eso es muy claro, aunque no puedo ver por qué querría vincular estáticamente en lugar de vincular dinámicamente de todos modos, aunque ahora MFC vive en WinSxS. Sin embargo, el OP dice que no está usando MFC. – Rup

+0

Quiere vincular estáticamente cuando escribe herramientas de línea de comandos que desea distribuir como EXEs sin el instalador y el tiempo de ejecución de MFC. –

1

¿Alguna posibilidad de que haya dejado el objetivo de plataforma predeterminado en "Cualquier CPU"? Si es así, cámbielo a x86 para código de 32 bits. Supongo que eso hará la mayor parte de la diferencia. El resto es probable en los cambios en las optimizaciones del compilador (desenrollado de bucle más agresivo y otras cosas en las que el tamaño se ha cambiado por velocidad, ya que la RAM es barata). Creo que todas las optimizaciones granulares todavía están disponibles desde la línea de comandos, pero muchas se han ocultado en los paneles de opciones de la interfaz de usuario.

+2

Esta configuración se aplica a.Proyectos NET, no es el caso del problema en cuestión (compilación nativa) – CharlesB

+0

no, también lo he intentado. El problema es 90% seguro de lo que comenté arriba: mientras migraba el proyecto, MFC volvió a entrar, pero ahora no tengo tiempo para verificar exactamente dónde está. Tan pronto como tenga algo de tiempo libre, verificaré y publicaré la conclusión final. – Migs

1

Ver Are there any tools for tracking down bloat in C++? - algunas técnicas sobre cómo analizar qué contribuye al tamaño del ejecutable se describen allí. Una vez que realice el análisis en los resultados de VC 6 y VS 2010, con suerte encontrará algo útil.

Hay un gotcha particular que me ha afectado al portar desde VC 6 a alguna edición de Visual Studio: el significado de algunas opciones de optimización ha cambiado y los valores que estaba usando en el proyecto VC 6 ya no son compatibles, y como Como resultado, el exe producido por VS no se optimizó en absoluto, lo que provocó que tanto el bloat ejecutable como el rendimiento lento. Verifique su configuración de optimización en Propiedades/C/C++/Optimization y asegúrese de que la optimización esté activa/Ox,/O2 o/O1.

1

Esto se debe a que en VS2010 la funcionalidad de Microsoft permite componentes HTML en las ventanas de diálogo, por lo que se integran y vinculan muchas cosas incluso si no las usa y las optimizaciones y opciones eliminan el código no referenciado. . No hay una "buena" forma de eliminar el código, pero hay algunas formas pirateadas. Compilamos nuestro material de tamaño crítico en VS2008 aún debido a esto. Nota al margen, nuestro código no GUI en realidad se compila más pequeño por lo que vale. Esperando que a MS se le ocurra una opción para esto en una corrección/parche para poder hacer todo en VS2010 pero no estoy conteniendo la respiración ...

2

Si está utilizando enlaces estáticos, sugiero usar los interruptores del enlazador si usted está compilando en la línea de comando usando la sintaxis:

cl/Ox [su (s) archivo (s) fuente (s) C++] [se requieren bibliotecas si corresponde] [se requieren archivos de recursos si los hay]/link/FILEALIGN: 512/OPT: REF/OPT: ICF/INCREMENTAL: NO

Si está construyendo dentro del IDE de Visual Studio, verifique la configuración del enlazador seleccionando las propiedades del proyecto en el menú. En la configuración, seleccione la Versión y luego haga clic en la configuración del vinculador que se encuentra en el panel izquierdo, esto le mostrará una lista de configuraciones correspondientes a la configuración del enlazador configurada actualmente de forma predeterminada.

En la línea de comando debajo del enlazador, especifique la opción/FILEALIGN: 512 en la entrada Opciones adicionales y luego haga clic en el botón Aplicar. En la opción General debajo del enlazador, desactive la vinculación incremental seleccionando No (/ INCREMENTAL: NO). En la opción de depuración del enlazador, seleccione No para generar información de depuración. Para la optimización del enlazador, seleccione Eliminar datos sin referencia (/ OPT: REF) en las referencias y Eliminar COMDAT redundantes (/ OPT: ICF) en el Plegado Habilitar COMDAT.

Para la optimización del compilador, asegúrese de que la configuración de Liberación esté seleccionada, haga clic en la vista de árbol de C/C++ en el panel izquierdo y debajo de eso, haga clic en Optimización, Seleccionar optimización completa (/ Ox). En la configuración general en C/C++, seleccione Deshabilitado para el formato de información de depuración.

No olvides hacer clic en el botón Aplicar para cada cambio que realices.

Espero que todo lo que he mencionado aquí sea útil para usted y todas estas se apliquen a Visual C++ 2005 y 2008, pero con suerte, también se aplicaría a Visual C++ 2010, de lo contrario, compruebe amablemente la documentación incluida con su Instalación de Visual C++ 2010.