Как уменьшить размер файла delphi
Generally, EXE files created with Delphi are larger than EXE files created with another programming language. The reason is the VCL. (Sure, VCL has many advantages. )
There are several ways to reduce a EXE's size:
01) Use a EXE-Packer (UPX, ASPack. )
03) Write your application without VCL
04) Use the ACL (API Controls Library)
05) Use StripReloc.
06) Deactivate remote debugging information and TD32.
07) You might want to put code in a dll.
08) Don't put the same images several times on a form. Load them at runtime.
09) Use compressed images (JPG and not BMP)
10) Store less properties in DFM files
(See Link below "How To Make Your EXE's Lighter")
11) Use the TStringList replacement by
Use the Minireg - TRegistry replacement by Ben Hochstrasser
UPX is a free, portable, extendable, high-performance executable
packer for several different executable formats. It achieves an excellent
compression ratio and offers very fast decompression.
Your executables suffer no memory overhead or other drawbacks.
ASPack is an advanced Win32 executable file compressor, capable of reducing the file size of
32-bit Windows programs by as much as 70%. (ASPack's compression ratio improves upon the
industry-standard zip file format by as much as 10-20%.) ASPack makes Windows 95/98/NT
programs and libraries smaller, and decrease load times across networks, and download
times from the internet; it also protects programs against reverse engineering
by non-professional hackers.
Programs compressed with ASPack are self-contained and run exactly as before,
with no runtime performance penalties.
KOL - Key Objects Library is a set of objects to develop power
(but small) 32 bit Windows GUI applications using Delphi but without VCL.
It is distributed free of charge, with source code.
Delphi lets you have it both ways. If you want tiny EXE's, then don't use
the VCL. Its entirely possible to use all the rich features of Delphi IDE
using 100% WinAPI calls, standard resources, etc.
ACL (API Controls Library)
To write the program on pure API certainly it is possible, but I have deci-
ded to reach both goals - both to make that program and to receive the tool,
through which it would be possible in further to build similar programs, almost,
as on Delphi with VCL. So the idea to create my own TWinControl and all standard
Windows controls classes, derived from it has appeared.
StripReloc is a free (GPL license) command line utility that removes the relocation
(".reloc") section from Win32 PE EXE files, reducing their size.
Most compilers/linkers (including Delphi) put a relocation section in EXE files,
but this is actually not necessary since EXEs never get relocated.
Hence, a relocation section only wastes space.
Why not use an EXE compressor?
Deactivating the Debug Information
Exclude any debug information for the final build
(project-Options Compiler - Debugging and project-Options
Linker EXE and DLL options)
Dependeing on the amount of Debug information,
Debugging can take up until half of the size.
The options that are going to singificantly reduce your file size are
"Include TD32 debug info" and "Build with runtime packages". If you are
shipping commercial applications, you usually don't need the debug info
linked with your project.
The forms in your project have any bitmaps on them, then these are
compiled into the EXE. If you use the same bitmap multiple times, don't
assign them at design-time in the IDE as it will be included in the EXE
multiple times, assign them in code instead.
This can help reduce the size of the EXE, especially if you use large
Use JPEG-files instead of BMP-files. This also reduces the EXE size.
How To Make Your EXE's Lighter:
TStringList replacement by
Minireg - TRegistry replacement
Добавить комментарий
Не использовать не нормативную лексику.
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
Я выпускаю один исполняемый файл (.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 попросил меня предоставить именно то, что я использую, поэтому вот они:
ОТВЕТЫ
Ответ 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 может удалить неиспользуемые процедуры и функции только в том случае, если он может следовать иерархии кода. Список кошмаров для компоновщика, перечисленных ниже:
Доступ к кодам и структурам данных осуществляется с начала, инициализации, секций финализации единиц. Здесь у вас есть контроль, удаление ненужных вызовов или создание объектов. Даже если вы создадите объекты по требованию и только освободите их в разделе финализации, аккуратно сделайте
Ответ 5
Если вы перейдете к инструментам/настройкам и настроите их таким образом, вы можете с легкостью сжать исполняемый файл, с которого вы работаете, через элемент меню в среде IDE.
Ответ 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:
D2010:
Итак, увеличение размера кода, но более чем удвоение данных!
Ответ 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 с помощью изменения значка.
В данном совете ПО мы откроем страшную тайну. В среде программирования Delphi 2006 и выше, релоки можно не удалять, а просто не создавать! Так в Delphi 2006 появилась недокументированная директива компилятора . Она позволяет настроить несколько тонких моментов создания нашего бинарника. В первую очередь она интересна тем, что позволяет отключить создание таблицы релокаций. Обратите свое внимание! Не отключайте таблицы релокаций в dll, bpl и др. файлах. Таблица релокации не нужна exe файлу, т.к. он всегда грузится по одному и тому же адресу.
Использование директивы очень простое:
Откройте файл проекта (dpr)
В uses добавьте Windows
Ниже пропишите
Попробуйте скомпилировать файл в Delphi до добавления этой директивы и после.
Вы сами сможете убедиться, что размер exe уменьшился. В дополнение хотим сказать, что использование SETPEFLAGS этим не ограничивается. У неё есть ещё масса интересных возможностей. Получить их полный список очень просто: Просто откройте модуль Windows
Найдите в нём поиском IMAGE_FILE_RELOCS_STRIPPED
Нашли? Ниже идёт целый список констант, начинающихся с IMAGE_FILE_
Справа идёт комментарий. Для включения нескольких инструкций, используйте or. Вот небольшой пример:
IMAGE_FILE_LINE_NUMS_STRIPPED or IMAGE_FILE_LOCAL_SYMS_STRIPPED or
IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP or IMAGE_FILE_NET_RUN_FROM_SWAP>
Что я здесь сделал?
IMAGE_FILE_RELOCS_STRIPPED - отрезали релоки
IMAGE_FILE_DEBUG_STRIPPED - убрали из ехе Debug информацию
IMAGE_FILE_LINE_NUMS_STRIPPED - убрали из exe информацию о номерах строк
IMAGE_FILE_LOCAL_SYMS_STRIPPED - убрали local symbols
IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP - При запуске exe с компакт-диска, флэш накопителя, других извлекаемых из персонального компьютера устройств, считать exe в свап и запустить оттуда. Полезно, если нужно запустить программу с компакта, а потом попросить вставить другой.
IMAGE_FILE_NET_RUN_FROM_SWAP - аналогично предыдущей, только для сетевых дисков. 618">
Используя Delphi (или вообще любые инструменты, если они существуют, конечно), возможно ли уменьшить размер exe-файла, удалив весь код, который не используется, но присутствует там?
(например, функция или процедура, которая присутствует, но никогда не вызывается).
Я помню, что в Pascal, используя unit (без объектов), компилятор включает в себя только те процедуры и функции, которые действительно используются, и удалит неиспользуемые подпрограммы в модуле из окончательного exe-файла.
С Object-pascal я помню, что в Delphi 1 все члены объекта включены в exe;
С тех пор что-то изменилось до Delphi-XE2?
Если вы не используете RTTI, вы можете добавить его в начало файла .dpr (сразу после program ), чтобы удалить дополнительная информация RTTI:
Если вы хотите удалить его из всех блоков RTL /VCL, вам нужно будет включить их и в файл проекта, чтобы вышеуказанные настройки вступили в силу. Я не думаю, что я бы порекомендовал сделать это, так как я не верю, что уменьшение размера исполняемого файла стоит сложностей компиляции вашего собственного RTL /VCL.
Вы также можете добавить следующее, где-то в вашем файле .dpr:
Это удалит информацию о перемещении, которая не нужна в .exe. Не добавляйте это в DLL или пакет!
(взято по ссылке выше)
Обычно 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 compress.
Просто чтобы дополнить то, что написали другие .
Интеллектуальный компоновщик удалит неиспользуемые подпрограммы кроме при следующих условиях:
В модуле есть раздел initialization - к сожалению, многие из самых крупных модулей в RTL /VCL (Classes, SysUtils, Windows, Forms . и другие) имеют разделы инициализации, поэтому, если они есть в вашем предложении uses , вы получите всю энчиладу, связанную с ваш код. Большая часть кода в RTL /VCL может быть реорганизована для уменьшения или устранения этого, но это нарушит обратную совместимость.
Подпрограмма является частью класса и помечена как виртуальная или динамическая - если вы создаете экземпляр и возражаете в своем коде, который имеет виртуальные или динамические методы, эти методы связаны с вашим исполняемым файлом независимо от того, вызываете вы их или нет.
Дополнительные шаги, которые можно предпринять, чтобы уменьшить размер исполняемого файла:
Воспользуйтесь преимуществами наследования форм. Если у вас много похожих форм, создайте базовую форму для их наследования. Эти дочерние формы будут хранить только свойства, которые отличаются от базовой формы в их dfms. Это может значительно уменьшить размер вашего исполняемого файла за счет устранения избыточной информации в ваших dfms.
Сохраняйте любую крупную графику во внешних файлах и загружайте ее по требованию - заставки, «обложки», наборы значков и т. д. действительно могут увеличивать размер исполняемого файла. Delphi не всегда сохраняет эти файлы в наиболее эффективном формате, когда они встроены в исполняемый файл.
Вы можете уменьшить размер exe на 10–30%, удалив некоторые неиспользуемые данные из exe после его компиляции. Есть сторонние инструменты, которые могут сделать это, но вы можете устранить некоторые из них, установив соответствующий PE-заголовок flags . Убедитесь, что вы понимаете значение каждого флага, прежде чем использовать его, так как некоторые флаги могут сделать ваш исполняемый файл непригодным для использования.
Скопируйте части RTL /VLC в свои собственные модули - вместо того, чтобы включать Classes или SysUtils в ваше предложение использования, создайте новый модуль и скопируйте в него только те классы и функции, которые вам нужны. Тогда используйте это вместо этого.
Разбейте код на загружаемые модули - если у вас есть несколько exe-файлов, которые повторно используют одни и те же модули, вы можете уменьшить их, используя dll или bpls, вместо того, чтобы статически связывать все в exes. DLL /bpl будут загружены в память только один раз, независимо от того, сколько exes это нужно.
Читайте также: