Уменьшить размер исполняемого файла Windows - PullRequest
5 голосов
/ 13 января 2009

У меня есть приложение на C ++ / MFC для Windows - динамически связано, оно статично только 60 КБ, оно> 3 МБ.
Это рассылка клиентам по электронной почте, поэтому она должна быть как можно меньше.

Он статически связывает библиотеки MFC и MSCVRT - потому что это исправление некоторых проблем, и я не хочу, чтобы больше обращались в службу поддержки по поводу отсутствующих библиотек - особенно очень полезная «неправильная конфигурация приложения» одна!

Есть ли в любом случае лишить Windows exe всех дополнительных вещей MFC, которые являются DLL, но я не использую?
Или скажите, чтобы он динамически связывал MSVCRT (который должен присутствовать), но статически связывал dll MFC, который может отсутствовать?

Редактировать - спасибо, что сократили до 1.6Mb, что нужно будет!

Ответы [ 4 ]

7 голосов
/ 13 января 2009

Я не уверен, как удалить исполняемый файл, но другая мысль - сжать его, например, используя upx , который распакует его и запустит на месте ... Уменьшает ли это размер тебе достаточно?

7 голосов
/ 13 января 2009

Нельзя смешивать библиотеки CRT / MFC. Из памяти ...

Как и предполагал другой ответ, вы можете #define WIN32_LEAN_AND_MEAN и VC_EXTRALEAN. Это, вероятно, не поможет, хотя. Они, как правило, сводятся к минимизации времени сборки, а не к окончательному размеру exe.

Если не считать перестройки MFC (это вариант - вы можете перестроить его / Os, или, если чувствуете себя действительно дерзко, / GL - но это, вероятно, приведет к еще большему развлечению вниз по течению - надеюсь, он уже собран /Gy).

OK. Простые вещи, чтобы попробовать. Создайте свое приложение с помощью / GL / Os / GF / Gy / GA. В компоновщике вы более или менее хотите / OPT: REF и / OPT: ICF и / LTCG.

Скажу сразу - сборка релиза от 30кб до мегабайт - это много. Вы также можете передать / map: компоновщику и посмотреть, что занимает все это пространство - но это очень и очень утомительно.

Похоже, MFC не был создан с / Gy, но это было бы удивительно.

4 голосов
/ 28 сентября 2016

Для программ, использующих CRT, вы можете использовать технику из этого видео, выполненную Per Vognsen для получения исполняемых файлов размером 3,5 КБ. Windows\System32\msvcrt.dll поставляется с каждой Windows начиная с 95, поэтому, ссылаясь на нее, вам не нужно упаковывать распространяемый Visual C ++ вместе с приложением.

Основной процесс:

  1. Запустите Visual Studio dumpbin на System32\msvcrt.dll и передайте его в файл
  2. Запустите простой фильтр (awk '{print $4}'), чтобы создать msvcrt.def файл
  3. Запустите VS lib на msvcrt.def, чтобы сгенерировать msvcrt.lib
  4. Отключить библиотеки по умолчанию в вашем проекте (/NODEFAULTLIB в командной строке link)
  5. Отключить некоторые проверки Visual C ++ (/GS- и удалить все /RTC<x> флажки)

Ссылка на kernel32.lib и msvcrt.lib и вуаля, ваш крошечный исполняемый файл имеет нулевые зависимости, кроме ОС.

(н.б .: для оптимизации по размеру (/O1), укажите memset в качестве встроенного, как подробно здесь .)

1 голос
/ 13 января 2009

Вы можете попробовать Dependency Walker , чтобы проверить, от каких DLL зависит ваш статический EXE-файл, затем, если это зависит от библиотеки, вы уверены, что она существует на компьютере вашего клиента, вы можете скомпилировать ее без и уменьшить размер.

...