Уменьшить исполняемый файл
Используя Delphi (или вообще любые инструменты, если таковые существуют, конечно), возможно ли уменьшить размер exe-файла, удалив весь код, который не используется, но присутствует там?
(например, функция или процедура, которая присутствует, но никогда не вызывается).
Я помню, что в Pascal, используя unit (без объектов), компилятор включает в себя только те процедуры и функции, которые действительно используются, и удалит неиспользуемые подпрограммы в модуле из окончательного exe-файла.
С Object-pascal я помню, что в Delphi 1 все члены объекта включены в exe;
С тех пор что-то изменилось до Delphi-XE2?
6 ответов
Если вы не используете 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 или пакет!
уменьшить размер 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
Если ваша цель состоит в том, чтобы уменьшить размер вашего исполняемого файла, вы можете использовать инструмент, который сжимает его и позволяет выполнять его так, как он не был сжат.. (= не zip)
Например, вы можете проверить UPX, который хорошо работает с программами Delphi.
Delphi имеет опцию умного связывания, которая включена по умолчанию, если я правильно помню. Это именно то, что вы описываете. Только используемые функции и данные связаны с вашим файлом. Если вам нужно дальнейшее сжатие размера, вы можете попробовать одну из многих программ exe compressor.
Просто чтобы дополнить то, что написали другие...
Умный компоновщик удалит неиспользуемые подпрограммы, за исключением следующих случаев:
Блок имеет
initialization
раздел - к сожалению, многие из самых больших модулей в RTL/VCL (классы, SysUtils, Windows, Forms... и многие другие) имеют разделы инициализации, так что если они находятся в вашемuses
оговорка, что вы получите всю энчиладу, связанную с вашим кодом. Большая часть кода в RTL / VCL может быть реорганизована для уменьшения или устранения этого, но это нарушит обратную совместимость.Подпрограмма является частью класса и помечена как виртуальная или динамическая. Если вы создаете экземпляр и возражаете в своем коде, который имеет виртуальные или динамические методы, эти методы будут связаны с исполняемым файлом независимо от того, вызываете ли вы его или нет.
Дополнительные шаги, которые можно предпринять, чтобы уменьшить размер исполняемого файла:
Воспользуйтесь преимуществами наследования форм - если у вас есть много похожих форм, создайте базовую форму для их наследования. Эти дочерние формы будут хранить только свойства, которые отличаются от базовой формы в их dfms. Это может значительно уменьшить размер вашего исполняемого файла за счет устранения избыточной информации в ваших dfms.
Сохраняйте любую крупную графику во внешних файлах и загружайте ее по требованию - заставки, "обложки", наборы значков и т. Д. Действительно могут увеличить размер исполняемого файла. Delphi не всегда сохраняет эти файлы в наиболее эффективном формате, когда они встроены в исполняемый файл.
Вы можете сбрить 10% - 30% от размера exe-файла, удалив некоторые неиспользуемые данные из exe-файла после его компиляции. Есть сторонние инструменты, которые могут сделать это, но вы можете устранить некоторые из них, установив соответствующие флаги PE-заголовка. Убедитесь, что вы понимаете значение каждого флага, прежде чем использовать его, так как некоторые флаги могут сделать ваш исполняемый файл непригодным для использования.
Скопируйте части RTL/VLC в свои собственные модули - вместо того, чтобы включать классы или SysUtils в ваше предложение использования, создайте новый модуль и скопируйте в него только те классы и функции, которые вам нужны. Тогда используйте это вместо этого.
Разбейте код на загружаемые модули - если у вас есть несколько exe-файлов, которые используют одни и те же модули, вы можете уменьшить их, используя dll или bpls, вместо того, чтобы статически связывать все в exe-файлы. Dll/bpl будут загружены в память только один раз, независимо от того, сколько exes это нужно.
Еще один вариант: используйте WinRar для создания установочного файла (да, WinRar может это сделать).WinRar может автоматически запускать EXE-файл после распаковки.
WinRar имеет превосходную степень сжатия. Одна из причин заключается в том, что он объединит все ваши файлы в один файл, а затем начнет сжатие, в то время как ZIP (и другие подобные не очень сложные компрессоры) будут сжимать каждый файл по отдельности и объединять их в большой файл после сжатия . сжатие.
Это дает алгоритму RAR больше шансов найти повторяющиеся данные среди ваших файлов.
Кроме того, WinRar менее сложен, чем другие инсталляторы (минус: он также не предлагает деинсталлятор, но его легко исправить с помощью вашей собственной программы).
Отказ от ответственности: я не связан с WinRar.