Уменьшить размер исполняемого файла Windows

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

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

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

Редактировать - спасибо, что довели его до 1,6 МБ, что нужно будет сделать!

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
6
0
8 197
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Вы не можете смешивать библиотеки 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, который распакует его и запустит на месте ... Достаточно ли это для вас уменьшает размер?

UPX отличный, одно из моих приложений - 6 МБ до и 2 МБ после upx!

KPexEA 14.01.2009 02:50

Кажется, отличный инструмент, но не работает для файлов .NET (C++ CLR). Кидает CantPackException: .NET files are not yet supported при попытке запустить на exe.

kiner_shah 30.04.2020 09:29

@kiner_shah - да, все решения, перечисленные на этой странице, предназначены для приложений MFC, а не для .NET.

Stobor 01.05.2020 06:41

Я использовал это для другого exe. Работает неплохо, уменьшено с 23 МБ до 7 МБ. :-)

kiner_shah 09.05.2020 08:17

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

Для программ, использующих CRT, вы можете использовать технику из это видео Пера Вогнсена для достижения исполняемых файлов 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 как внутренний, как подробно описано в здесь.)

Другие вопросы по теме