У меня есть приложение C++ / MFC для Windows - динамически связано, оно всего 60 КБ, статическое, это> 3 МБ. Он распространяется среди клиентов по электронной почте и поэтому должен быть как можно меньше.
Он статически связывает библиотеки MFC и MSCVRT - потому что это исправление некоторых проблем, и я не хочу больше звонков в службу поддержки по поводу отсутствующих библиотек - особенно очень полезной «конфигурация приложения неверна»!
Есть ли способ удалить из Windows exe все дополнительные файлы MFC, которые являются dll, но которые я не использую?
Или скажите ему динамически связать MSVCRT (который должен присутствовать), но статически связать dll MFC, которого может не быть?
Редактировать - спасибо, что довели его до 1,6 МБ, что нужно будет сделать!





Вы не можете смешивать библиотеки DLL CRT / MFC. По памяти ...
Как предполагал другой ответ, вы можете #define WIN32_LEAN_AND_MEAN и VC_EXTRALEAN. Хотя это, вероятно, не поможет. Они, как правило, сводятся к минимуму времени сборки, а не к окончательному размеру exe.
Если не считать перестройки MFC (что является вариантом - вы можете перестроить его / Os, или, если вы чувствуете себя очень дерзко, / GL - но это, вероятно, приведет к большему веселью ниже по течению - надеюсь, он уже построен / Gy).
ОК. Простые вещи, которые стоит попробовать. Создайте свое приложение с помощью / GL / Os / GF / Gy / GA. В компоновщике вы более или менее хотите / OPT: REF и / OPT: ICF и / LTCG.
Скажу сразу - релизная сборка с 30к до мегабайт - это многовато. Вы также можете передать / map: компоновщику и посмотреть, что занимает все это пространство, но это очень утомительно.
Похоже, что MFC не был построен с / Gy, но это было бы удивительно.
Я не уверен, как удалить исполняемый файл, но еще одна мысль - сжать его, например, с помощью upx, который распакует его и запустит на месте ... Достаточно ли это для вас уменьшает размер?
Кажется, отличный инструмент, но не работает для файлов .NET (C++ CLR). Кидает CantPackException: .NET files are not yet supported при попытке запустить на exe.
@kiner_shah - да, все решения, перечисленные на этой странице, предназначены для приложений MFC, а не для .NET.
Я использовал это для другого exe. Работает неплохо, уменьшено с 23 МБ до 7 МБ. :-)
Вы можете попробовать Зависимость Уокер, чтобы проверить, от каких DLL зависит ваш статический EXE-файл, тогда, если это зависит от библиотеки, вы уверены, что она существует на вашем клиентском компьютере, вы можете скомпилировать без нее и уменьшить размер.
Для программ, использующих CRT, вы можете использовать технику из это видео Пера Вогнсена для достижения исполняемых файлов 3,5 КБ. Windows\System32\msvcrt.dll поставляется с каждой Windows, начиная с 95, поэтому, установив ссылку на нее, вам не нужно упаковывать распространяемый пакет Visual C++ с вашим приложением.
Основной процесс:
dumpbin на System32\msvcrt.dll и направьте его в файлawk '{print $4}'), чтобы создать файл msvcrt.def.lib на msvcrt.def, чтобы сгенерировать msvcrt.lib/NODEFAULTLIB в командной строке link)/GS- и удалите все флаги /RTC<x>)Свяжите с kernel32.lib и msvcrt.lib и вуаля, ваш крошечный исполняемый файл не имеет никаких зависимостей, кроме ОС.
(Примечание: чтобы оптимизировать размер (/O1), укажите memset как внутренний, как подробно описано в здесь.)
UPX отличный, одно из моих приложений - 6 МБ до и 2 МБ после upx!