c++ - compilar - Reducir el tamaño del archivo ejecutable de Windows
g++ windows (4)
No estoy seguro de cómo quitar el ejecutable, pero otro pensamiento es comprimirlo, por ejemplo, usando upx , que lo descomprimirá y lo ejecutará en su lugar ... ¿ Eso reduce el tamaño para usted?
Tengo una aplicación C ++ / MFC en Windows. Vinculada dinámicamente, solo tiene 60kb de estática, es> 3Mb.
Es un ser que se distribuye a los clientes por correo electrónico y, por lo tanto, debe ser lo más pequeño posible.
Vincula estáticamente las bibliotecas MFC y MSCVRT, porque es una solución para algunos problemas y no quiero más llamadas de soporte sobre las librerías perdidas, especialmente la muy útil ''configuración de la aplicación es incorrecta''.
¿Hay alguna forma de quitar un exe de Windows de todo el material extra de MFC que es el dll pero que no estoy usando?
O dígale que enlace dinámicamente a MSVCRT (que debe estar presente) pero enlace estáticamente el dll de MFC que podría no serlo.
Editar - ¡gracias por bajar a 1.6Mb que tendrá que hacer!
No puede mezclar las dlls CRT / MFC. Pasando de la memoria ...
Como sugirió la otra respuesta, puede #definir WIN32_LEAN_AND_MEAN y VC_EXTRALEAN. Sin embargo, probablemente esto no ayude. Tienden a minimizar el tiempo de construcción, no el tamaño final del ejecutable.
Si no se reconstruye MFC (que es una opción, podrías reconstruirlo / Os, o si te sientes realmente descarado, / GL), pero esto probablemente te lleve a más diversión río abajo. Espero que ya esté construido / Gy).
DE ACUERDO. Cosas simples para probar Crea tu aplicación con / GL / Os / GF / Gy / GA. En el vinculador, más o menos quiere / OPT: REF y / OPT: ICF y / LTCG.
Tengo que decir que una versión de lanzamiento de 30k a megabytes es un poco demasiado. También podría pasar / mapear: al engarce y ver qué está ocupando todo ese espacio, pero eso es muy tedioso.
Casi parece que MFC no fue creado con / Gy, pero eso sería sorprendente.
Puede probar Dependency Walker para comprobar de qué archivos DLL depende su archivo EXE estático, y si depende de una biblioteca, está seguro de que existe en la máquina de su cliente, puede compilar sin él y reducir el tamaño.
Para los programas que usan el CRT, puede utilizar la técnica en este video de Per Vognsen que detalla cómo lograr ejecutables de 3.5kb al vincular solo a Windows/System32/msvcrt.dll
que se envía con cada Windows desde 95, por lo que no necesita empaqueta Visual C ++ Redistributable con tu aplicación.
El proceso es algo como esto:
- Ejecute el
dumpbin
Visual Studio en suSystem32/msvcrt.dll
ySystem32/msvcrt.dll
a un archivo - Realice un filtrado simple (
awk ''{print $4}''
) para crear un archivomsvcrt.def
- Ejecute la
lib
de VS enmsvcrt.def
para generar unmsvcrt.lib
"personalizado" - Deshabilite todas las bibliotecas predeterminadas en la configuración del enlazador para su proyecto (
/NODEFAULTLIB
en la línea de comando) - Deshabilite algunas comprobaciones de Visual C ++ en la configuración de su proyecto (
/GS-
y elimine cualquier marca/RTC<x>
)
Simplemente msvcrt.lib
enlace contra kernel32.lib
y msvcrt.lib
y ahora su pequeño ejecutable tiene cero dependencias. (A menos que cuente el sistema operativo).
(nb: si desea poder optimizar el tamaño ( /O1
), debe especificar memset
como un intrínseco definido por el usuario como se detalla en esta respuesta SO .)