Подтвердить что ты не робот

Что я могу сделать, чтобы уменьшить размер исполняемого файла (Delphi)?

Я выпускаю один исполняемый файл (.EXE) для настольной программы, использующей Delphi 2009. У меня нет внешних DLL или ресурсов, которые мне нужны для запуска программы.

Я использую два компонента: LMD Innovative ELPack и Сергей Ткаченко TRichView, которые скомпилированы в мой исполняемый файл.

Когда я создаю свою производственную версию, используя конфигурацию сборки "Release", исполняемый файл составляет 13 533 КБ.

До использования Delphi 2009 я использовал Delphi 4. Исполняемый файл был только 2,671 Кбайт, включая те же самые два компонента и в основном с тем же кодом, что и моя текущая версия.

Я действительно понимаю, что Delphi 2009 полностью Unicode (что является основной причиной, почему я обновил), а Unicode может привести к удвоению размера. Но это примерно в 5 раз больше.

Есть ли причина, по которой мой исполняемый файл должен оставаться в 5 раз больше? Или есть несколько простых способов сократить значительную часть исполняемого файла?


Обратите внимание. Некоторые люди отвечают с помощью способов сжатия Delphi EXE. Это не то, что я пытаюсь сделать. Я пытаюсь просто понять, почему так много места используется, чтобы удалить то, что может не понадобиться. Если это будет сделано, сжатие может быть выполнено после этого, если это необходимо.

На самом деле не имеет значения, насколько большой или маленький исполняемый файл после его установки. Он предназначен для загрузки и минимизации загрузки и загрузки сервера, которые вы хотите сжать. Я предпочитаю использовать Inno Setup и сжимать программу внутри самой программы установки. Затем, когда он установлен, он расширяется до полного размера. Это предотвращает возможное обнаружение вируса и устраняет дополнительное время запуска, необходимое для распаковки программы в памяти. Кроме того, я кодирую как мою исполняемую, так и мою программу установки, и некоторые методы сжатия несовместимы с этим.

Подробнее о сжатии см. в вопросе StackOverflow: Delphi EXE-компрессор?


ldsandon попросил меня предоставить именно то, что я использую, поэтому вот они:

Параметры компиляции http://www.beholdgenealogy.com/img/compilingoptions.jpg

Параметры привязки http://www.beholdgenealogy.com/img/linkingoptions.jpg

4b9b3361

Ответ 1

При переходе с Delphi 7 на Delphi 2010. наш .exe вырос, например, с 16 до 35 мегабайт.

Несколько недель назад я задал вопрос, похожий на ваш вопрос на форуме Embarcadero. (ссылка) В моем OP я перечислил серию ссылок на эту тему, которые могут оказаться полезными.

Мы попытались использовать UPX для сжатия нашего .exe. Если позволить ему работать часами, это значительно сократит наш .exe, но мы, вероятно, не будем использовать его в производстве по следующим причинам:

  • У нас есть довольно много .exe и не хочу ждать 1/2-day для каждой сборки. (Возможно, мы могли бы найти набор параметров негрубой силы для UPX, который уменьшил бы это...)

  • Хотя размер .exe сокращен, нашего shippable не было, потому что наш установщик (не удивительно) не смог выжать гораздо больше сжатия из уже сжатого файла... тогда как он смог уменьшить оригинальные 16 meg.exe до 8 мегабайт.

  • Я прочитал несколько отчетов, которые в какой-то момент (редко, но не всегда) UPX exe запускал различные антивирусные программы, чтобы сообщить, что приложение содержит вирус. (Я не помню дату, сайт или детали того, где я это видел, поэтому мне немного несправедливо сообщить об этом здесь.) Но мы так рискуем рисковать, что даже такая возможность случается, что UPX находится вне таблицы...

Ссылка на форуме Embarcadero также включает ссылку в другой поток SO по этой теме.

Я продолжаю удивляться и разочаровываться в том, что мы переместились на Delphi 2010. Когда Ник замечает, 2X для Unicode довольно чрезмерен.

Тем не менее, раздувание является относительно небольшим компромиссом при переходе на D2010, потому что IMO, D2010 является таким потрясающим обновлением многими другими способами. Но это означает, что нам, вероятно, придется переместиться на 2 компакт-диска, а не на один. Я не ожидаю реакции на это от нашей организации...

Ответ 2

Не видя фактических настроек, которые использует ваша конфигурация сборки "Release", объясняя это увеличение размера, требуется много предположений.

Помимо некоторых, возможно, маловероятных факторов, приводящих к значительному увеличению количества кода, "затягиваемого", даже если он не используется, эта величина увеличения будет легче всего объяснить включением отладочной информации.

Я бы посмотрел ваши настройки компилятора и компоновщика для:

  • Отладочная информация (настройка компилятора)
  • TD32 info (linker)
  • Удаленная информация об отладке (компоновщик)

Сравните эти настройки в проекте Delphi 2009 с эквивалентами в Delphi 4.

Ответ 3

Измените ожидаемое увеличение на 2X от Unicode, и в итоге вы получите неудовлетворенный прирост в 2,5 раза. Это имеет смысл, учитывая, сколько версий вы пропустили. Много много было добавлено в VCL и RTL с Delphi 4, и не все это - материал, который можно легко скомпоновать, даже если вы никогда его не используете. В зависимости от того, сколько единиц вы используете, вы могли бы перевозить довольно много лишнего багажа.

Allen Bauer и команда компилятора добавили новую функцию в D2010, чтобы помочь уменьшить это, но, по-видимому, они осторожно ступают и не делают используйте его как можно больше мест. Надеюсь, в 2011 году и последующих релизах мы увидим более резкое сокращение.

Ответ 4

Я добавлю несколько слов. Linker может удалить неиспользуемые процедуры и функции только в том случае, если он может следовать иерархии кода. Список кошмаров для компоновщика, перечисленных ниже:

  • Код, управляемый сообщениями, печальная новость заключается в том, что этот код не может быть удален вообще, поэтому размер пустого проекта Delphi продолжает расти с версии на версию. Каждое новое сообщение Windows (например, WM_TOUCH, если я знаю недавно) создает иерархию вызовов процедур, которая не может быть удалена (даже если у вас нет плана использовать Touch API вообще). Это потому, что каждый фрагмент WM _: - это то, что линкер не может решить, будет ли он использоваться или нет.

  • Доступ к кодам и структурам данных осуществляется с начала, инициализации, секций финализации единиц. Здесь у вас есть контроль, удаление ненужных вызовов или создание объектов. Даже если вы создадите объекты по требованию и только освободите их в разделе финализации, аккуратно сделайте

Ответ 5

Используйте "upx - сжимайте или разворачивайте исполняемые файлы" @http://upx.sourceforge.net


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

Configuration

Ответ 6

Еще один способ - посмотреть, "какой блок увеличивает размер?".

Для этого я использую JCL 'Project Analyzer IDE', интегрированный в IDE с установкой JCL/JVCL, он показывает вам все единицы с их соответствующим размером. Вы можете экспортировать его в текстовый файл. Если вы сделаете это с 2 средами (D4 и D2009), у вас будет много информации.

Ответ 7

Я провел несколько тестов, чтобы увидеть разницу между D2007 и D2010, потому что мы обновляемся до D2010. Я тестировал приложение GUI среднего размера с примерно 60 формами (сетки с формами деталей, фреймами и т.д.). Мы используем компоненты TMS + Remobjects.

D2007:
" нормальная "компиляция: 18.8mb
с debug dcu: 18.8mb (одинаковый размер!)

D2010
нормальный: 23.9
debug dcu: 48.8mb (!)

Таким образом, использование debug dcu удваивает наш размер exe...

Тест с нашим бизнес-сервисом (без больших dfm):
D2007: 12.3mb
D2010: 17.1mb

Итак, да, D2010 увеличивает exe (немного), но это не проблема для моего клиента.

Изменить: некоторая информация о скомпилированном размере:
D2007:
alt text
D2010:
alt text

Итак, увеличение размера кода, но более чем удвоение данных!

Ответ 8

Если вы не хотите использовать exe-компрессор, вы должны дать StripReloc попробовать.

Ответ 9

1) Вы создаете подробный файл карты, и поскольку вы установили "используемый debug dcus", он также будет содержать символы для единиц RTL/VCL. Если он используется системами обработки исключений для создания стеков вызовов и т.п., Он может быть добавлен в исполняемый файл. И если это не сжато, это может сделать ваш размер .exe довольно большим.

2) Использование debug dcus также сделает ваш .exe несколько более крупным, потому что обычно они скомпилированы без настройки оптимизации и отладки, и они также замедляют ваш код. Они не должны использоваться в выпускной версии.

3) Отладочная информация должна добавлять информацию debig только к устройству, а не к исполняемому файлу, хотя требуется, чтобы IIRC создавал файл карты.

Ответ 10

Проверьте формат ваших dfm-s. Они должны быть в двоичном формате, если вы хотите сделать свой exe меньше.

Ответ 11

Стандартные единицы в вашем более позднем delphi могут содержать больше строк и констант, таких как строки ошибок, которые включены, даже если вы отключите отладочную информацию. Проверьте свои возможности.

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

(Мои опыты с Delphi 5)

Ответ 12

Так как D2010 добавляет расширенный RTTI, а RTTI является печально известным фактором увеличения размера exe, было бы интересно посмотреть, как большие D2009 файлы для этого приложения.

Если двоичные файлы D2009 значительно меньше, это не Unicode и т.д. Для моих собственных двоичных файлов у меня есть только увеличение на 30% или около того от D7 до D2009.

Ответ 13

Ранее было сказано, что использование исполняемого компрессора уменьшает размер исполняемого файла, но не установочного пакета. Однако, если вам нужен хороший компрессор, попробуйте ASPack.

@Tom1952: ASPack работает довольно быстро, всего несколько секунд, чтобы сжать файл

Ответ 14

Также вы можете изменить значок. Значок в новейшей среде IDE Delphi (т.е. XE3) совместим с Vista/7 и содержит все размеры (до 256x256, насколько я знаю). Таким образом, вы можете уменьшить размер файла exe с помощью изменения значка.