Уменьшить исполняемый файл - PullRequest
19 голосов
/ 13 сентября 2011

Используя Delphi (или вообще любые инструменты, если они существуют, конечно), возможно ли уменьшить размер exe-файла, удалив весь код, который не используется, но присутствует там? *
(например, функция или процедура, которая присутствует, но никогда не вызывается).
Я помню, что в Pascal, использующем unit (без объектов), компилятор включает только те процедуры и функции, которые действительно используются, и удалит неиспользуемые подпрограммы в модуле из окончательного exe-файла.

В Object-pascal я помню, что в Delphi 1 все члены объекта включены в exe;
С тех пор что-то изменилось до Delphi-XE2?

Ответы [ 5 ]

19 голосов
/ 13 сентября 2011

Если вы не используете RTTI, вы можете добавить это в начало вашего файла .dpr (сразу после program), чтобы удалить дополнительную информацию RTTI:

{$IFOPT D-}{$WEAKLINKRTTI ON}{$ENDIF}
{$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])}

Если вы хотите удалитьэто из всех модулей RTL / VCL, то вам нужно будет включить их и в файл проекта, чтобы вышеуказанные настройки вступили в силу.Я не думаю, что я бы порекомендовал сделать это, так как я не верю, что уменьшение размера исполняемого файла стоит сложностей компиляции вашего собственного RTL / VCL.

Вы также можете добавить следующее, снова где-то вФайл .dpr:

{$SetPEFlags IMAGE_FILE_RELOCS_STRIPPED}

Это удалит информацию о перемещении, которая не требуется в .exe.Не добавляйте это в DLL или пакет!

8 голосов
/ 13 сентября 2011

уменьшить размер приложения EXE - отличная статья

(взято по ссылке выше)

Обычно EXE-файлы, созданные с помощью Delphi, больше, чем EXE-файлы. создан с другим языком программирования. Причина в VCL. (Конечно, у VCL есть много преимуществ ...)

Есть несколько способов уменьшить размер EXE:

01) Использовать EXE-упаковщик (UPX, ASPack, ...) - UPX

02) Используйте KOL.

03) Напишите ваше заявление без VCL

04) Использование ACL (Библиотека элементов управления API)

05) Использовать StripReloc.

06) Отключить информацию об удаленной отладке и TD32.

07) Возможно, вы захотите поместить код в DLL.

08) Не помещайте одни и те же изображения в форму несколько раз. Загрузите их во время выполнения.

09) Использовать сжатые изображения (JPG, а не BMP)

10) Хранить меньше свойств в файлах DFM

4 голосов
/ 13 сентября 2011

Если ваша цель состоит в том, чтобы уменьшить размер вашего исполняемого файла, вы можете использовать инструмент, который сжимает его и позволяет выполнять его так, как он не был сжат .. (= не zip)

Например, вы можете проверить UPX , который прекрасно работает с программами delphi.

3 голосов
/ 13 сентября 2011

Delphi имеет опцию smart linking , которая включена по умолчанию, если я правильно помню. Это именно то, что вы описываете. Только используемые функции и данные связаны с вашим файлом. Если вам нужно дальнейшее сжатие размера, вы можете попробовать одну из многих программ exe compress.

1 голос
/ 18 ноября 2011

Просто чтобы дополнить то, что написали другие ...

Интеллектуальный компоновщик исключит неиспользуемые подпрограммы , за исключением , при следующих условиях:

  • Устройство имеет секцию initialization - к сожалению, многие из самых больших модулей в RTL / VCL (классы, SysUtils, Windows, Forms ... и многие другие) имеют разделы инициализации, поэтому, если они находятся в ваше uses предложение, вы получите всю энчиладу, связанную с вашим кодом. Большая часть кода в RTL / VCL может быть реорганизована для уменьшения или устранения этого, но это нарушит обратную совместимость.

  • Подпрограмма является частью класса и помечена как virtual или dynamic - если вы создаете экземпляр и возражаете в своем коде, который имеет виртуальные или динамические методы, эти методы связаны с вашим исполняемым файлом независимо от того, вызываете вы их или нет.

Дополнительные шаги, которые можно предпринять, чтобы уменьшить размер исполняемого файла:

  • Воспользуйтесь преимуществами наследования форм - если у вас много похожих форм, создайте базовую форму для их наследования. Эти дочерние формы будут хранить только свойства, которые отличаются от базовой формы в их dfms. Это может значительно уменьшить размер вашего исполняемого файла за счет устранения избыточной информации в ваших dfms.

  • Храните любую крупную графику во внешних файлах и загружайте ее по требованию - заставки, скины, наборы значков и т. Д. Действительно могут увеличивать размер исполняемого файла. Delphi не всегда сохраняет эти файлы в наиболее эффективном формате, когда они встроены в исполняемый файл.

  • Вы можете сбрить 10% -30% от размера exe-файла, удалив некоторые неиспользуемые данные из exe-файла после его компиляции. Есть сторонние инструменты, которые могут сделать это, но вы можете устранить некоторые из них, установив соответствующий заголовок PE flags . Убедитесь, что вы понимаете значение каждого флага, прежде чем использовать его, так как некоторые флаги могут сделать ваш exe-файл непригодным для использования.

  • Скопируйте части RTL / VLC в свои собственные модули - вместо того, чтобы включать классы или SysUtils в ваше предложение использования, создайте новый модуль и скопируйте в него только те классы и функции, которые вам нужны. Тогда используйте это вместо этого.

  • Разбейте код на загружаемые модули - если у вас есть несколько exe-файлов, которые используют одни и те же блоки, вы можете уменьшить их, используя dll или bpls, вместо того, чтобы статически связывать все в exes. DLL / bpl будут загружены в память только один раз, независимо от того, сколько это нужно exes.

...