Lazarus как уменьшить размер исполняемого файла

Обновлено: 06.07.2024

Среда разработки Lazarus очень похожа на Делфи. Однако все мои знакомые программисты, которым по тем или иным причинам приходилось “пересаживаться” с Делфи на Lazarus, при компиляции первой же программы буквально охреневали от одной особенности Lazarus. А именно - от очень большого размера исполняемого файла (EXE-файла) откомпилированной программы.

Ну например, если графическое приложение, которое ничего не делает (пустое окно), после компиляции в Делфи занимает примерно 385 килобайт, то такое же приложение, созданное с помощью Lazarus, “весит” около 15 МЕГАбайт. То есть в 40 раз больше!

На самом деле всё не так страшно. Просто Lazarus по умолчанию “пихает” в ЕХЕ-файл отладочную информацию, которая и занимает так много места.

Избавиться от этого достаточно просто - надо в настройках проекта запретить включать в исполняемый файл отладочную информацию. Для этого выбираем меню:

Как уменьшить размер EXE-файла в Lazarus

а в открывшемся окне в группе ПАРАМЕТРЫ КОМПИЛЯТОРА выбираем ОТЛАДКА. Здесь снимаем галочку у надписи “Генерировать отладочную информацию…” и нажимаем кнопку ОК (см. рис.).

Как уменьшить размер исполняемого файла в Lazarus

Ну вот и всё. Осталось только перекомпилировать вашу программу, и вы увидите, что размер исполняемого файла стал намного меньше. Правда, он всё-равно будет немного больше, чем такая же программа, созданная в Делфи. Но это уже плата за бесплатность Lazarus.

ВНИМАНИЕ!
Таким образом вы отменяете генерацию отладочной информации ТОЛЬКО для данного проекта. При создании нового проекта по умолчанию отладочная информация БУДЕТ помещаться в EXE-файл. Чтобы её убрать, надо проделать все описанные выше шаги для нового проекта (и для всех остальных проектов, в которых отладочная информация вам не нужна).

Звезда активна
Звезда активна
Звезда активна
Звезда активна
Звезда активна

Как видно из заголовка статьи разговор будет о размере исполняемого файла при компилирование в Lazarus. Это частый вопрос у тех кто только недавно начал программировать в Lazarus. И так начнем.

Введение

Картинка для привлечения внимания

lazarus exe size

При первой компиляции в Lazarus проекта, многие удивляются размеру исполняемого файла . Ниже приведено сравнение размеров скомпилированного пустого проекта в разных средах программирования.

Среда разработкиРазмер файла по умолчанию (байт)Размер файла с оптимизацией (байт)
Lazarus 15 210 592 1 818 112
Delphi XE7 11 510 970 2 277 376
Delphi 7 368 128 368 128

Как видно из этой таблицы не все так уж и плохо у лазаруса в плане размеров, последние версии Delphi изрядно растолстели, как осенние белки. Но все же далеко ему и до Delphi 7. В общем есть куда стремится. Если же добавить на форму кучу разных компонент то размер файла будет весьма впечатляющий.

Вот пример размера файла самой среды Lazarus собранной с кучей установленных компонентов.


Все каких то 235 мегабайт. 235 мегабайт Карл. Файл lazarus.old.exe собран как раз таки с оптимизацией. Разница в размере видна невооружённым взглядом.

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

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

Настройка параметров компилирования

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

Открывалась форма параметры проекта. И на вкладках выставлялись нужные галочки.

На вкладке Компиляция и компоновка снимались галочки.

lazarus project options

На вкладке Отладка снималась галочка "Генерировать отладочную информацию" и ставилась галочка "Вырезать символы из исполнимого файла"

lazarus debug

Данные настройки позволяют уменьшить размер файла.

В новой же версии Lazarus, на данный момент пишу это для версии 1.4.4 все несколько упростилось.

Теперь можно сделать так. Открываем параметры проекта и нажимаем на "Параметры компиляции". Затем нажимаем кнопку рядом с режимами сборки.

lazarus option

Появится окно параметров сборки. Тут нажимаем кнопку "Создать режимы отладочной и конечной сборки ". В окне появится еще два режима сборки, Release и Debug, такие же режимы если в последних версиях Delphi XE?.

Режим Release будет создавать маленький исполняемый файл.

После этого на панели инструментов появится кнопка выбора режимов.

lazarus panel

Достаточно выбрать нужный режим.

Это методы используемые из среды разработки. Теперь про дополнительные методы.

Утилита Strip.exe

В комплекте с компилятором Free Pascal имеется замечательная утилита Strip.exe, которая вычищает отладочную информацию из исполняемого файла.

Утилита запускается из командной строки с параметрами

strip.exe --strip-all project1.exe

Но это не наш метод.

Сделать можно так.

Открываем меню Сервис - Настроить внешние средства.

В открывшемся окне необходимо добавить новый инструмент. Я сделал так.

lazarus strip

Теперь можно пользоваться утилитой strip.exe прямо из среды разработки.

Утилита upx.exe.

Так же для уменьшения размеров файла можно использовать различные упаковщики. Они позволяют существенно уменьшить размер программы. А более продвинутые позволяют установить защиту на исполняемый файл или триальный период. Одной из самых распространенных программ для сжатия файлов является UPX. Данная утилита одна из самых простых в использовании. Из командной строки это делается так.

upx.exe --best project1.exe

Но опять же все можно упростить до минимума.

Как и в предыдущем методе делаем так .

lazarus strip

И можем пользоваться утилитой из среды разработки.

lazarus menu

Она сжимаем файл достаточно хорошо. И не особо уменьшает скорость запуска файла. Пример работы показан на изображение.

lazarus folder

Почти троекратное сжатие файла.

Использование LLCL - Lazarus Light LCL

Недавно появились компоненты которые позволяют существенно уменьшить размер исполняемого файла. Это компоненты LLCL этакий аналог KOL для Delphi. Это набор файлов в которых переработанных классов free pascal (поправьте если ошибаюсь) где часть кода переписана на ассемблере, что позволяет уменьшить размер занимаемый исполняемым файлом. LLCL основан на базе Light VCL replacement for Delphi 7 наборе классов для Delphi 7 .

LLCL не требует установки его в Lazarus, достаточно просто в параметрах компиляции проекта сделать на них ссылку. И при сборке будут использоватся эти классы, а не стандартные от лазаруса.

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

lazarus form1

А затем собрал проект. Несколько ниже приведены полные результаты эксперимента. Затем я использовал компоненты LLCL. Делается это так. Открывается окно параметров проекта, затем выбирается пункт пути и нажимается кнопка "Другие модули".

В появившемся окне добавляем в верхнее окно путь к папке с файлами LLCL.

lazarus -fu

Затем нажал Ок и закрыл параметры проекта. И снова собрал проект снова. Исполняемый файл стал весьма меленьким. Решил еще оптимизировать проект. Удалил стандартную иконку из проекта. И пересобрал проект. Программа стала еще меньше. И под конец сжал её upx-ом. Результаты видно тут. Это очень замечательно. Можно писать очень маленькие вирусы утилиты на лазарусе.

P.S. Дальнейшие испытания показали что при использование LLCL придется применять крайне малый набор графических компонент. Это печально.

lazarus all size

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

Наверно одно из первых что бросается в глаза при разработке ПО на Lazarus, это размер файла exe. Дело в том что вся отладочная информации по умолчанию, хранится в нашем исполняемом файле.

Удалять ее оттуда я советую вам только после того как вы полностью отладили свою программу.

1

Создав приложение с 2-мя кнопками, на выходе получаем следующий вес: 14,7 МБ Много не правда ли?

Итак мы создали с вами приложение, протестировали его, теперь пришло время его немного оптимизировать. Для этого нужно зайти в Параметры проекта

2

Компиляция и компоновка -> Отметить следующие пункты:

3

Отладка, Отключить отладочную информацию и включить Вырезать символы из исполняемого файла

4

Теперь заново компилируем файл, и получаем размер: 1,74 МБ Выглядит уже лучше, неправда ли? Но это еще не все, убрав стандартный значек: 1,61 МБ

5

Так же можно воспользоваться бесплатным компоновщиком файлов UPX: the Ultimate Packer for eXecutables

Скачиваем его, распаковываем в удобное для нас место. Закидываем туда наш файл программы и перетаскиваем ее на upx.exe

6

Для удобства в Lazarus можно добавить данный пункт меню.

7

Заходим в Сервис -> Настроить внешние средства Жмем Добавить

Как уменьшить размер исполнимого файла?
Всем привет.. поставил на днях Zalarus на Ubuntu 10.10. и при компиляции пустого проекта у меня.

Как уменьшить размер exe-файла?
Создал элементарную программку на lazarus. Прога -- только одна форма и одна кнопка, а exe весит 14.

Как уменьшить размер приложения для КПК
Добрый день! Решил посмотреть, как программируется для КПК. Поставил себе Lazarus 0.9.30. Все.

Как уменьшить размер Lazarus.exe после установки компонентов?
Здравствуйте! После установки компонентов lazarus.exe весит около 200 мб. Есть ли какая нибудь.

Решение

Я про использование ненужных модулей, типа Dialogs, если я не вызываю никакого MessageDLG

Зато ты наверняка вызываешь ShowMessage, которая тоже оттуда же. Вообще, при установке галочки в Настройки проекта - Параметры компилятора - Подробность вывода - Подсказки о неиспользуемых модулях, тебе компилятор сам скажет, какие из подключенных модулей действительно не используются. Их можешь смело удалять из списка Uses.

Или правый клик мыши в окне редактора -> Переработка кода -> Неиспользуемые модули

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

Убрал из uses все, кроме Forms и StdCtrls, поставил на форму один TButton, и все равно exe-шник весит 1,83 мб (столько же, сколько и со всеми модулями + еще одной формой)

Добавлено через 50 секунд

если содержимое модуля не используется - оно и в exe-файл добавлено не будет же знал? А в чем интересно, она заключается, эта умная компоновка? А в чем интересно, она заключается, эта умная компоновка

насколько я себе представляю, радикально уменьшить размер исполняемого файла графического приложения LCL не получится. Минимальное приложение будет примерно 1.7 - 1.8 Мб.

Уменьшить можно:
1. отказавшись от GUI LCL - в пользу интерфейса командной строки
2. вместо LCL - делать GUI на чистом WinApi
3. вместо LCL - делать GUI на fpGUI (например)
4. попробовать KOL, но насколько я понял оно заброшено и имеет много ограничений

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

Kitayets, ага, я вконец отказался от идеи. Пойдет как есть, пара мегабайт - не конец света. хоть и неприятно Кому неприятно? Тебе? Так ты посмотри на размер программ, которые установлены на твоём компьютере. на официальном форуме есть отдельная ветка, посвященная библиотеке LLCL (что-то похожее на KOL), использовать крайне просто. It's an emulation of a small subset of the standard LCL/VCL, for only the most basic controls and classes , with their most common properties, methods and events То есть, в любую секунду можно столкнуться с тем, что кто-то (чтобы сэкономить меньше 2МБ дискового пространства) посчитал то свойство/метод, которое тебе вдруг понадобилось, недостаточно распространенным и часто используемым, чтобы включить его в LLCL. И Что? Опять велосипедостроение, или послать LLCL лесом, и начинать заново разработку на LCL/VCL, и не зависеть от чьего-то хотения, а пользоваться всей мощью этих библиотек? Даже не начиная использовать LLCL я выбираю второй вариант (ибо у кнопки есть не только свойство Caption и метод OnClick, а у StringGrid-а есть десятки методов и свойств, которые я довольно активно использую, но использование их другими встречаю очень редко. Про TThread без Synchronize я вообще ничего говорить не хочу) Так ты посмотри на размер программ, которые установлены на твоём компьютере. А вы считаете это нормальным? А если завтра появятся компы с десятками теробайт ОЗУ и с винтом более тысячи теробайт, то можно будет и "вес окна с кнопкой" делать гига так под два? Такое впечатление, что разработчикам компиляторов, как и авторам многих современных книг, стали платить не за содержание и качество, а за объём.

Добавлено через 1 минуту

Тайнейшая тайна для меня тоже))

Добавлено через 18 минут

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

Действительно, зачем отказываться от чего-то, что с трудом создали многие программисты, при чем абсолютно безвозмездно, открыто (я про LCL)

Добавлено через 2 минуты
так что я услышал ответ на свой вопрос - "2 Мб должно хватить всем"))


Как уменьшить размер исполняемого файла, созданного в Delphi 7 (как использовать KOL)
Здравствуйте! Подскажите, пожалуйста, как уменьшить размер исполняемого файла, созданного в Delphi.

Где отключить Debug чтобы уменьшить размер исполняемого файла
Из-за отладочной информации файл весит аж 7мб (и это пустая форма), и создается в win32/debug. .


Как уменьшить размер exe-файла?
Exe весит 10 мб. , не могу понять почему. Сначала думал что фоновые картинки и кнопки ( кнопками.

Как уменьшить размер EXE файла?
Люди, подскажите, пожалуйста, что можно отключить, чтобы скомпилённый экзешник стал немного.

Почему размер исполняемого файла в Delphi XE2 меняется при каждом билде
Здравствуйте. Подскажите, почему размер исполняемого файла в Delphi XE2 меняется при каждом билде и.

Уменьшить размер кода (считывание с ini файла)
Вот получился у меня такой говно-код, подскажите, каким образом его можно сократить: if.

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

Также стоит отметить, что в полученную программу «Hello, world!» включено множество возможностей, таких как:

  • практически все виджеты Lazarus Component Library (LCL)
  • Все Runtime библиотеки Free Pascal
  • работа с XML
  • библиотеки для обработки файлов рисунков типа png, bmp и ico

Это делает размер приложения довольно большим.

Начальный размер исполняемого файла Lazarus велик, однако растет в дальнейшем довольно медленно.

1. Проект | Параметры прокета | Генерация кода | Умная компоновка (-CX) -> Поставить галочку

lazinst014

2. Проект | Параметры прокета | Компоновка | Выдавать номера строк в ошибках времени выполнения (-gl) -> Убрать галочку

3. Проект | Параметры прокета | Компоновка | Использовать внешний файл отладочных символов GDB (-Xs) -> Поставить галочку

4. Проект | Параметры прокета | Компоновка | Умная компоновка (-XX) -> Поставить галочку

lazinst013

Проведя настройки и скомпилировав приложение снова, мы увидим, что размер его сократился с 14,5 МБ до 1,62 МБ что вполне вполне допустимо, учитывая что размер уже не будет расти слишком быстро.

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

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

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

Тем не менее, если воспользоваться упаковщиком в нашем случае со следующими параметрами:

Читайте также: