Sign in Join
Wiki copytemporary

Lazarus Faq/ru: what changed

Revision 2 to 3. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11> **Note:** Этот FAQ может быть **устаревшим** в некоторых частях.
22
33## Общее
44
55### Почему получаемые бинарные файлы очень большие?
66
77Бинарные файлы очень большие из-за того, что включают в себя много отладочной информации для использования в отладчик [gdb](http://www.gnu.org/software/gdb) (GNU Debugger). Компилятор имеет настройку для удаления отладочной информации из исполняемого файла (-Xs), но из-за ошибки в компиляторе (версия 2.0.2 и ниже) она не работает корректно. Ошибка исправлена в версиях компилятора 2.0.4 и выше.
88
99Вы можете использовать программу "strip" для удаления отладочной информации из исполняемых файлов. Она находится в каталоге Lazarus'а: lazarus\pp\bin\i386-win32\\.
1010
1111Наберите "strip --strip-all \<путь к исполняемому файлу\>" в командной строке.
1212
1313Если Вы хотите сделать Вашу программу очень маленькой, то Вы можете попробовать использовать [UPX](http://upx.sourceforge.net/). UPX - это очень хороший exe-упаковщик. It includes no memory overhead due to in-place decompression. И также имеет очень быструю распаковку (~10 МБ/сек на Pentium 133).
1414
1515Для использования upx наберите "upx \<путь к исполняемому файлу\>" в командной строке.
1616
1717После использования strip и upx простая GUI программа на Lazarus'е получается:
1818
1919- ~ 700Кб на Linux
2020- ~ 420Кб на Windows
2121
2222Для более детальной информации о недостатках использования UPX обратитесь к статье [[Size Matters/ru|Размер имеет значение]]. Также нужно отметить, что "hello world" программы lazarus уже включают в себя множество возможностей, таких как:
2323
2424- Библиотеку работы с XML
2525- Библиотеки для обработки файлов рисунков типа png, xpm, bmp и ico
2626- Практически все виджеты Lazarus Component Library (LCL)
2727- Все Runtime библиотеки Free Pascal
2828
2929Всё это делает приложение большим, но это так же и включает всё, что может потребоваться нетривиальному приложению.
3030
3131Начальный размер исполняемого файла Lazarus велик, однако растёт в дальнейшем довольно медленно. Проект на С++ (это для примера, но относится и к другим языкам / инструментальные средства тоже), сначала очень маленький (типа "Hello world"), но быстро растет по экспоненте, когда Вы добавляете дополнительные возможности, чтобы написать нетривиальное приложение.
3232
3333![](/wiki-images/d/de/Lazarus_vs_cpp.png)
3434
3535**Краткое руководство по уменьшению размера Lazarus/FPC приложения** *(проверено в Lazarus 0.9.26)*
3636
3737- 1\. Project\|Compiler Options\|Code\|Smart Linkable (-CX) -\> Поставить галочку
3838- 2\. Project\|Compiler Options\|Linking\|Debugging\|Display Line Numbers in Run-time ErrorBacktraces (-gl) -\> Убрать галочку
3939- 3\. Project\|Compiler Options\|Linking\|Debugging\|Strip Symbols From Executable (-Xs) -\> Поставить галочку
4040- 4\. Project\|Compiler Options\|Linking\|Link Style\|Link Smart (-XX) -\> Поставить галочку
4141
4242Самые важные элементы, мне кажется, 2 и 3. Для простого приложения выполнимый размер должен теперь составить 1-3 Мбайта вместо 15-20 Мбайт. В этом пункте Вы можете также попробовать: Project\|Compiler Options\|Code\|Optimizations\|smaller, вместо Faster -\> Поставить галочку (Предупреждение: это может уменьшить производительность),
4343
4444- 5\. (Опционально) Запустите UPX \<путь к исполняемому файлу\> для сжатия вашего бинарника дополнительно в 2-3 раза (Предупреждение: как сказано выше, есть недостатки в использовании UPX).
4545
4646### УСТАРЕЛО: Почему компоновка такая медленная в Windows?
4747
4848Эта проблема свойственна лишь старым версиям: FPC 2.2 и Lazarus 0.9.24. Пожалуйста обновите Лазарус. Всё написанное здесь относится **только** к старым версиям.
4949
5050В общем, компоновка на Windows занимает больше времени, чем на других платформах, потому что GNU компоновщик под эту операционную систему очень медленный. FPC (2.2) использует этот компоновщик при сборке программ. Эта проблема возникает только на Windows и только на слабых компьютерах (с процессором частотой менее 1ГГц и/или оперативной памятью меньше 128 Мегабайт)
5151
5252Также, если вы используете умную компоновку (smartlinking), общее время компиляции так же увеличиться. Подробнее об этом можно прочитать здесь: [[File size and smartlinking]]
5353
5454Для решения этой проблемы, был разработан внутренний компоновщик. Он есть во всех версиях FPC, начиная с 2.2. Его использование позволило в значительной степени сократить общее время компиляции. Внутренний компоновщик используется только при компиляции для Windows системы.
5555
5656### Мне нужен ppc386.cfg или fpc.cfg?
5757
5858Вам нужен только fpc.cfg. В нем указаны пути, по которым компилятор будет искать библиотеки.
5959
6060### Как я могу скомпилировать lazarus?
6161
6262Нет ничего проще :)
6363
64-`$ cd lazarus`\
65-`$ make clean all`
64+```text
65+$ cd lazarus
66+$ make clean all
67+```
6668
6769### Как собирать LCL проекты без Lazarus-а?
6870
6971- В тех случаях, когда использование графической среды невозможно, вы можете воспользоваться утилитой командной строки: lazbuild.
7072
7173Эта утилита используется для сборки проектов и lazarus-пакетов (packages).
7274
7375- Если вам нужно собрать LCL приложение без среды разработки и не используя lazbuild, вам необходимо добавить следующие строки в файл *fpc.cfg*
7476
75-`  # строчки начинающиеся с # можно не добавлять`\
76-`  # это комментарии`\
77-`  # пути для других модулей и компонентов `\
78-` -Fu{Путь_к_лазарусу}/lcl/units/{целевая_система}`\
79-` -Fu{Путь_к_лазарусу}/components/units/{целевая_система}`
77+```text
78+ # строчки начинающиеся с # можно не добавлять
79+ # это комментарии
80+ # пути для других модулей и компонентов
81+ -Fu{Путь_к_лазарусу}/lcl/units/{целевая_система}
82+ -Fu{Путь_к_лазарусу}/components/units/{целевая_система}
83+```
8084
8185
8286Где {целевая_система} это системный префикс, указывающий для какой системы располагаются модули. Обычно этот префикс представляет собой пару имён "Процессор-ОСь", например i386-win32, i386-linux, i386-darwin.:
8387
8488После добавления этих строк в конфигурационный файл, вызовете команду: fpc myproject.lpr myproject.lpr это имя основного файла проекта (модуль начинающийся с "program" или "library"). Но имя может быть другим, т.к. Лазарус не принуждает Вас использовать расширение .lpr.
8589
8690Кроме того, если Ваш проект использует какие-либо особые настройки, вы можете получить командную строку для компиляции, используя меню в Лазарусе: *Проект-\>Параметры проекта...-\>Показать параметры* (параметров может быть очень много, удобно скопировать их в отдельный скрипт файл .bat или .sh);
8791
8892### Какая версия FPC требуется?
8993
9094Версия 2.4.0 для всех операционных систем.
9195
9296### Я не могу скомпилировать Lazarus
9397
94981. Проверьте версию компилятора
95992. Проверьте версию (fpc)библиотек, они должны быть той же версии
961003. Проверьте путь установки компилятора на наличие в нем пробелов. Пробелов в нем не должно быть!
971014. Проверьте наличие файла fpc.cfg, а не старого файла ppc386.cfg
981025. Проверьте также OS-dependent FAQs
99103
100104### При компиляции проекта возникает ошибка:
101105
102106#### "Cannot find Unit interfaces". Как можно это исправить?
103107
104108Ошибка возникает потомучто компилятор не может найти 'interfaces.ppu' **или** он найден, но он поврежден, неправильной версии или просрочен.
105109
106110Этот модуль может находиться в {LazarusDir}\lcl\units\\{TargetCPU}-{TargetOS}\\{LCLWidgetSet}\interfaces.ppu. Например: /home/username/lazarus/lcl/units/i386-linux/gtk/interfaces.ppu.
107111
108112Убедитесь, что он только здесь. Если находятся несколько версий interfaces.ppu, то вы возможно получите неверную конфигурацию (к примеру добавлен каталог lcl в список путей поиска). Удалите все interfaces.ppu, оставьте только тот что в каталоге указаном выше.
109113
110114Если вы выберете другой widgetset, то при пересборке lazarus, понадобится пересобрать LCL для этого widgetset.
111115
112116Если ошибка возникает несмотря на то что 'interfaces.ppu' на месте - значит используется, иная compiler/rtl для компиляции проекта нежели для компиляции Lazarus IDE. Можно сделать одно из следующего:
113117
114118- Пересобрать LCL (или полностью Lazarus) с компилятором выбраным в Environmnent Options. Для этого можно кликнуть Tools -\> Build Lazarus. Перед этим проверьте текущие настройки в Tools -\> Configure Build Lazarus.
115119- Поменять компилятор в Environment Options на тот что используется для компиляции Lazarus. Посмотрите внимательно также в Environment Options что используются корректный путь к каталогу Лазаря (Lazarus Directory) и к исходникам FPC. Убедитесь что есть только только один файл конфигурации fpc.cfg - он должен располагаться /etc/ для Linux/Unix или вместе с компилятором fpc под Windows. Попробуйте запустить "fpc -vt bogus" для того чтобы увидеть какой fpc.cfg используется на вашей системе. Мешающие копии обычно появляются при обновлении компилятора; они могут находится в домашнем каталоге или вместе с пересобраным новым компилятором. УДАЛИТЕ ИХ!!
116120- Можно также попробовать сменить текущий widgetset проекта. Например, примерный проект "objectinspector" поставляемый с Лазарем поумолчанию использует gtk. Компиляция этого проекта наверняка выдаст "Can't find unit interfaces" под Windows. Смена widgetset на default(Win32) в Project \| Compiler Options... \| LCL Widget Type (various) должно исправить это.
117121
118122### Когда я пытаюсь откомпилировать проект Delphi в lazarus, я получаю сообщение об ошибке
119123
120124#### Ошибка на строке :{\$R *.DFM}. Как мне решить эту проблему?
121125
122126Lazarus (а точнее - Linux) не знает о таком понятии, как "ресурсы", и не может использовать некоторые связанные с ними понятия, пришедшие из Delphi/Win32. Однако, Lazarus использует методы, обеспечивающие совместимость с этими понятиями. Вы сможете использовать формы Delphi (файлы .dfm), если выполните следующие шаги:
123127
124128- Используйте текстовые версии .dfm-файлов. D5 и более поздние версии используют такие файлы по умолчанию. Если у вас более старые файлы, выполните следующее: нажмите ALT-F12 для просмотра кода формы в виде текста и скопируйте/вставьте текст. Если у вас есть текстовый .dfm-файл, просто скопируйте его содержание в .lfm-файл.
125129- Создайте файл с помощью lazres (в меню lazarus/tools) следующей командой: lazres yourform.lrs yourform.lfm
126130- Добавьте следующую строку в секцию initialization:
127131
128-`     initialization`\
129-`     {$I yourform.lrs}`
132+```text
133+ initialization
134+ {$I yourform.lrs}
135+```
130136
131137Пожалуйста, помните, что не все свойства объектов, описанные в dfm-файлах, поддерживаются Lazarus, и часть из них может вызвать падения IDE.
132138
133139Примечание: Вы не получите этой ошибки, начиная с версии Lazarus 0.9.29 (SVN) при использовании FreePascal 2.4.0 и выше. Компилятор этой версии умеет включать такие ресурсы в исполняемый файл на всех платформах. Тем не менее, проблема несовместимости отдельных свойств от этого не исчезает.
134140
135141#### Ошибка: 'Identifier not found LazarusResources'.
136142
137143При создании формы Lazarus автоматически добавляет некоторые необходимые модули в секцию uses вашего модуля, содержащего форму. После конвертации из Delphi в модуле могут отсутствовать необходимые ссылки. В данном конкретном случае вам необходимо добавить в секцию uses модуль LResources.
138144
139145### При обращении к событиям объектов, например OnClick объекта button, я получаю следующую ошибку: ERROR unit not found: stdCtrls
140146
141147Убедитесь (Project -\> Project Inspector),что ваш проект зависит от пакета 'LCL' и что вы установили исходники FPC.
142148
143149Lazarus - это IDE (среда разработки) и библиотека визуальных компонентов LCL. Все другие вещи, как IO, Database, FCL и RTL предоставляются FPC. IDE нужны пути ко всем исходникам.
144150
145151Пути к исходникам FPC могут быть установлены через: Environment -\> Environment Options -\> Files -\> FPC source directory (Окружение -\> Параметры -\> Файлы -\> Каталог исходного кода FPC).
146152
147153### Как внедрять содержимое небольшого файла в исполняемый файл? Как внедрять ресурсы?
148154
149155Например,
150156
151-`/your/lazarus/path/tools/lazres sound.lrs sound1.wav sound2.wav ...`
157+```text
158+/your/lazarus/path/tools/lazres sound.lrs sound1.wav sound2.wav ...
159+```
152160
153161создаст sound.lrs из sound1.wav и sound2.wav.
154162
155163Потом включите его *после* lrs-файла формы:
156164
157-`...`\
158-`initialization`\
159-`{$i unit1.lrs} // this is main resource file (first)`\
160-`{$i sound.lrs} // user defined resource file`\
165+``` pascal
166+...
167+initialization
168+{$i unit1.lrs} // this is main resource file (first)
169+{$i sound.lrs} // user defined resource file
161170
162-`end.`
171+end.
172+```
163173
164174В Вашей программе эти ресурсы можно использовать следующим образом:
165175
166-`Sound1AsString:=LazarusResources.Find('sound1').Value;`
176+``` pascal
177+Sound1AsString:=LazarusResources.Find('sound1').Value;
178+```
167179
168180### Что означают различные расширения файлов, используемые Lazarus?
169181
170182Глава [[Lazarus Tutorial|Lazarus Tutorial#The Lazarus files]] разъясняет назначение некторых расширений. Вот их краткий список:
171183
172184`*.lpi`
173185файл с информацией о проекте Lazarus (в формате XML; содержит настройки, относящиеся к конкретному проекту)
174186
175187`*.lpr`
176188программный файл Lazarus; содержит основной Pascal-код программы
177189
178190`*.lfm`
179191файл формы Lazarus; содержит информацию обо всех объектах, размещённых на форме (хранится в специальном текстовом формате; связанные с объектами формы действия хранятся в одноимённом `*.pas`-файле)
180192
181193`*.pas` или `*.pp`
182194модуль с Pascal-кодом (обычно связан с формой в одноимённом `*.lfm`-файле)
183195
184196`*.lrs`
185197файл ресурсов Lazarus (это генерируемый файл; не является файлом ресурсом Windows).
186198
187199Этот файл может быть создан с помощью утилиты lazres (в каталоге Lazarus/Tools) путё вызова из командной строки: lazres myfile.lrs myfile.lfm
188200
189201`*.ppu`
190202скомпилированный модуль
191203
192204`*.lpk`
193205информационный файл для пакета Lazarus (в формате XML; содержит настройки, относящиеся к конкретному пакету)
194206
195207### Когда я пишу *var mytext: text;*, чтобы объявить текстовый файл, я получаю ошибку "Unit1.pas(32,15) Error: Error in type definition". Как можно это исправить?
196208
197209Класс TControl содержит свойство [[doc:lcl/controls/tcontrol.text.html|Text]]. В методе формы используется тип[[doc:rtl/system/text.html|Text]] из модуля system. Вы можете использовать тип [[doc:rtl/system/text.html|TextFile]], который всего лишь является другим названием типа Text, или можете добавить модуль при объявлении (см. в примере):
198210
199-`  var`\
200-`  MyTextFile: TextFile;`\
201-`  MyText: System.Text;`
211+``` pascal
212+ var
213+ MyTextFile: TextFile;
214+ MyText: System.Text;
215+```
202216
203217Сходный конфликт имен существует и при связывании и закрытии текстового файла. TForm имеет методы *assign* и [[doc:lcl/forms/tcustomform.close.html|Close]]. Вместо них вы можете использовать [[doc:rtl/objpas/assignfile.html|AssignFile]] и [[doc:rtl/objpas/closefile.html|CloseFile]], или же добавлять имя модуля *System* (System.Close, System.Assign).
204218
205219### Я получаю ошибку при использовании Printer.BeginDoc
206220
207221Модуль Printers должен быть добавлен в секцию uses.
208222
209223Пакет Printer4Lazarus должен быть добавлен в зависимости Вашего проекта в IDE: Project\|Project Inspector\|Add\|New Requirement\|Package Name:
210224
211225Если пакета Printer4Lazarus нет в списке пакетов, то Вам нобходимо установить его. Пакет является частью установки Lazarus и может быть найден по следующему пути: \[каталог установки lazarus\]\components\printers
212226
213227Если Вы используете стандартный путь для установки Lazarus'а, то \[каталог установки larazus\] находится:
214228
215229- Windows: c:\lazarus
216230- Linux: /usr/lib/lazarus
217231
218232Данное решение также применимо, если Вы получаете исключения при использовании Printer.Printers
219233
220234### Почему TForm.ClientWidth/ClientHeight - это то же самое, что и TForm.Width/Height?
221235
222236TForm.Width/Height не включают границ окна, поскольку не существует способа получить размер этих границ на всех платформах. Без надёжного способа LCL будет перемещать формы по всему экрану или бесконечно изменять их размер.
223237
224238В конечном итоге, когда появится надёжный способ получения размера и позиции окна вместе с его границами для всех платформ, это будет изменено. Для сохранения совместимости со старыми LCL-формами, будет введён номер версии и использованы некоторые другие дополнительные методы.
225239
226240## Отладка
227241
228242### Как увидеть отладочные сообщения?
229243
230244В модуле LCLProc в LCL есть две процедуры для вывода отладочных сообщений. Они называются:
231245
232246- **DebugLn:** которая работает также, как WriteLn, но принимает только строки.
233247- **DbgOut:** которая работает также, как Write, но принимает только строки.
234248
235249В обычных условиях сообщения выводятся в stdout. Если stdout закрыт (например когда приложение {\$AppType Gui} или откомпилировано с ключом -WG под Windows), сообщения не выводятся никуда.
236250
237251Отладочные сообщение могут также выводится в файл. Код инициализации модуля LCLProc проверяет командую строку Lazarus.exe's на предмет наличия ключа '--debug-log=\<file\>'. Если этот ключ присутствует - весь последующий отладочный вывод направляется в \<file\>.
238252
239253Если этого ключа нет, проверяется существование системной переменной окружения xxx_debuglog, где xxx - имя файла программы без расширения. Для Lazarus это будет lazarus_debuglog. Если такая переменная окружения существует, файл указанный в ней будет использован для вывода отладочных сообщений. Пример: если вы сделаете:
240254
241-`set lazarus_debuglog=c:\lazarus\debug.txt`
255+```text
256+set lazarus_debuglog=c:\lazarus\debug.txt
257+```
242258
243259то отладочные сообщения будут выводится в c:\lazarus\debug.txt.
244260
245261Так как это реализовано в lclproc, любое приложение использующее lclproc может использовать этот механизм вывода отладочных сообщений.
246262
247263Отладка Lazarus-а
248264Наиболее полезно для Windows: Если вы хотите выводить сообщения в консоль, добавьте {\$APPTYPE console} в lazarus.pp ; После чего перекомпилируйте Lazarus.
249265
250266### Как мне просмотреть значение свойств?
251267
252268Вам нужно использовать самую последнюю версию FPC из исходников (2.5.1) или релиз 2.4.0. Любая версия позднее указанных, так же подойдёт.
253269
254270Если Вы скомпилируете приложение, использую ключ -gw (отладочная информация dwarf), Вы сможете просмотреть значения свойств.
255271
256272**Внимание:** это возможно, только для тех свойст, которые напрямую связан с членом класса, директива "read" указывает на переменную, а не метод.
257273
258274Если свойство возвращает значение через функцию, то достаточно опасно проверять её значение. Риск заключается в том, что для проверки её значения требуется вызвать процедуру или функцию, что может привести к изменению других значений и/или данных. А это значит, что данные изменились в режиме отладки, и дальнейшее исполнение программы, будет отличаться от работы без отладчика.
259275
260276Проверка свойства по результату функции (как описана выше), ещё не реализована.
261277
262278### Почему отладчик не показывает некоторые переменные или структуры (выдавая ошибки "no such symbol"/"incomplete type")
263279
264280Для решения проблем с: - свойствами\
265281\- динамическими массивами\
266282\- переменными во вложенных процедурах\
267283\- "no such symbol in context"\
268284\- "incomplete type"\
269285смотри здесь [[GDB Debugger Tips]]
270286
271287### Как я могу проводить отладку компонентов и пакетов FCL с помощью Lazarus
272288
273289Компоненты и классы FCL скомпилированны по умолчанию без отладночной информации. Как результат - gdb не моэет получить доступ к методам и свойствам этих объектов. Для пересборки компонентов FCL необходимо включить ключ компилятора "-gl" для генерации отладочной информации.
274290
275291Этот пример предпологает, что у вас Linux дистрибутив с установленным FPC в папке /usr/local/ и вам необходимо включить отладочную информацию для пакета fcl-db. По аналогии с пакетом fcl-db, используемом в данном примере, вы можете применить эти команды для ЛЮБЫХ пакетов, содержащихся в дистрибутиве.
276292
277293В начале, вам необходимо найти путь к установленному FPC проверив ваш конфигурационный файл FPC. Это файл (fpc.cfg) расположен /etc/fpc.cfg. Просмотрите содержимое fpc.cfg определить папку установки. Обратите внимание на строки, начинающиеся с -Fu в fpc.cfg:
278294
279-`-Fu/usr/local/lib/fpc/$fpcversion/units/$fpctarget/*`
295+```text
296+-Fu/usr/local/lib/fpc/$fpcversion/units/$fpctarget/*
297+```
280298
281299При создании скрипта для установки модулей в папку INSTALL_PATH/lib/fpc/\$fpcversion/units/\$fpctarget/, вы должны быть уверены, что /usr/local это путь установки FPC, и он должен быть присвоем INSTALL_PREFIX, в противном случае Make-скрипт установи модули в неправильную папку или вообще завершится с ошибкой.
282300
283301**Step 1**: Открыть терминал и набрать терминале\
284302**Step 2**: cd /user/local/share/src/fpc-2.3.1/fpc/fcl-db/\
285303**Step 3**: sudo make clean all install INSTALL_PREFIX=/usr/local OPT=-gl\
286304Замечание: Параметр INSTALL_PREFIX правильно указан для установки модулей. В примере ниже /usr/local - это путь по умолчанию для fpc в Linux, но он может сильно отличаться в других операционных системах
287305
288-`make clean all install INSTALL_PREFIX=/usr/local OPT=-gl`
306+```text
307+make clean all install INSTALL_PREFIX=/usr/local OPT=-gl
308+```
289309
290310В конце, после пересборки любого FCL пакета, вам возможно необходимо будет пересобрать LCL.
291311
292312## Contributing / Making Changes to Lazarus
293313
294314### Я создал патч для пристыковки окна сообщений IDE к окну "Редактор исходного кода" (снизу)
295315
296316Такие патчи не будут приняты, так как они реализуют лишь малую часть требуемой функциональности стыковки (docking). Цель состоит в создании полноценного менеджера стыковки и его использовании. Полноценный менеджер стыковки(dock manager) может соединять все окна и позволяет пользователю определять, как их стыковать (должно ли окно сообщений быть над или под окном кода ... или вообще быть отделено от него). К примеру:
297317
298318 +-------------------++--+
299319 |menu || |
300320 +-------------------+| |
301321 +--++---------------+| |
302322 |PI|| Source Editor ||CE|
303323 +--+| || |
304324 +--+| || |
305325 | |+---------------++--+
306326 |OI|+-------------------+
307327 | ||messages |
308328 +--++-------------------+
309329
310330Менеджер стыковки может сохранить это расположение и восстановить его при следующем старте. Предпочтительно, если менеджер может работать не только с окнами, но и со страницами редактора кода. Менеджер стыковки не требует использования drag&drop. Все патчи реализующие стыковку без менеджера стыковки усложняют реализацию настоящего менеджера стыковки и потому будут отклонены.
311331
312332В качестве временного решения можно использовать это расширение IDE: [[Manual Docker]]
313333
314334### Я исправил/улучшил Lazarus. Как добавить мои изменения в официальный код Lazarus?
315335
316336Создайте патч и пришлите его разработчикам. Более подробную информацию смотрите здесь [[Creating A Patch/ru]].
317337
318338### How can I become a Lazarus developer and access management in the SVN and bug-tracker?
319339
320340First of all: you must learn about Lazarus, to prove your knowledge and skill. Start by reading the [[Lazarus Documentation|wiki articles]], read the Lazarus source code, giving a look at the [Lazarus Bug-Tracker](http://www.lazarus.freepascal.org/mantis), fix some bugs, and if you think you are ready, contact the developers on the [mailing list](http://www.mail-archive.com/lazarus@miraclec.com).
321341
322342## Где объявлены ...
323343
324344### Константы виртуальных клавиш
325345
326346Константы виртуальных клавиш (VK_UP, VK_ESCAPE и т.д ) объявлены в [[doc:lcl/lcltype|LCLType]]. Добавьте LCLtype в uses секцию.
327347
328348## Использование среды разработки
329349
330350### Как я могу использовать "завершение идентификаторов"?
331351
332352Чтобы вызвать окно завершения идентификатора нажмите \[ctrl\]\[space\] (по умолчанию для Windows и Linux).
333353
334354Вы можете настроить автоматическое появление этого окошка в пункте меню *Окружение-\>Редактор-\>Code Tools-\>Автоматические функции*
335355
336356## Linux
337357
338358### Как выполнить отладку в Linux без IDE?
339359
340360Прежде всего потребуется отладчик. gdb это стандартный отладчик под линукс, имеющий несколько GUI-интерфейсов. Наиболее распространённый интерфейс - ddd - является частью большинства популярных дистрибутивов. Для компиляции lazarus/lcl с информацией для отладчика вам нужно использовать следующие команды для запуска отладочной сессии:
341361
342-` $ make clean; make OPT=-dDEBUG`\
343-` $ ddd lazarus`
362+```text
363+ $ make clean; make OPT=-dDEBUG
364+ $ ddd lazarus
365+```
344366
345367Однако, следует отметить что ddd не такой удобный как например отладчик Lazarus. Особенно если он используется для просмотра значений имеющихся переменных, учитывая что ddd/gdb регистрозависимы, а Pascal - регистронезависим. Поэтому, чтобы видеть значения переменных, необходимо набирать их имена в верхнем регистре. Для получения более подробной информации обратитесь к fpc-manuals.
346368
347369### I can debug now but ddd does not find my sources or complains that they contain no code. Whats that?
348370
349371This is a path-related problem with either gdb or ddd. You can avoid this by
350372
351373- Use the "Change directory" command from the ddd menu and choose the directory where the sources are located. The drawback of this method is that you now can't use the source of the program you started with (e.g. lazarus). Thus it may be neccessary to change the directory multiple times.
352374- In ddd goto \[Edit\] \[gdb-settings\] and set the search-path
353375- Create a \$(HOME)/.gdbinit file like:
354376
355-`     directory /your/path/to/lazarus`\
356-`     directory /your/path/to/lazarus/lcl`\
357-`     directory /your/path/to/lazarus/lcl/include`
377+```text
378+ directory /your/path/to/lazarus
379+ directory /your/path/to/lazarus/lcl
380+ directory /your/path/to/lazarus/lcl/include
381+```
358382
359383### I receive an error during the linking that states /usr/bin/ld can't find -l\<some lib\>
360384
361385**Package Based Distributions**
362386You need to install the package that provides the lib\<somelib\>.so or lib\<somelib\>.a files. Dynamic libs under linux have the extension .so, while static libs have the extension .a. On some Linux distro's you have installed the package (rpm, deb) \<packagename\> which provides \<some lib\>, but you also need the development package (rpm, deb), normally called \<packagename\>-dev, which contains the .a (static lib) and/or the .so (dynamic lib).
363387
364388Some distributions have commands to find which package contains a file:
365389
366390**Mandriva**
367391
368-`[]$ urpmf lib<somelib>.so`
392+```text
393+[]$ urpmf lib<somelib>.so
394+```
369395
370396
371397will list all packages containing the file named lib\<somelib\>.so, you'll have to install those ending in -devel
372398
373399
374400**Debian**
375401
376402
377403install the apt-file utility (apt-get install apt-file) then
378404
379-`[]$ apt-file search lib<somelib>.so`
405+```text
406+[]$ apt-file search lib<somelib>.so
407+```
380408
381409
382410will list all packages containing the file named lib\<somelib\>.so, you'll have to install those ending in -dev
383411
384412**Source Based Distributions and Manual Compilation (LFS)**
385413Make sure that there is a lib\<somelib\>.a in the path, and that it contains the right version. To let the linker find the dynamic library, create a symlink called lib\<some lib\>.so to lib\<some lib\>\<version\>-x,y.so if necessary (and/or for static lib; lib\<some lib\>.a to lib\<some lib\>\<version\>-x,y.a).
386414
387415**FreeBSD**
388416As source based distro's, and also make sure you have -Fl/usr/local/lib in your fpc.cfg and/or Lazarus library path. Keep in mind that GTK1.2 has "gtk12" as package name under FreeBSD. (same for glib) NOTE: This has changed as of late. Newest ports have gtk-12 and glib-12 as well. You might stumble on this problem, since FPC requires the "-less" ones, you will need to symlink them like this:
389417
390-`[]# cd /usr/local/lib && ln -s libglib-12.so libglib12.so`\
391-`[]# cd /usr/X11R6/lib && ln -s libgtk-12.so libgtk12.so`\
392-`[]# cd /usr/X11R6/lib && ln -s libgdk-12.so libgdk12.so`
418+```text
419+[]# cd /usr/local/lib && ln -s libglib-12.so libglib12.so
420+[]# cd /usr/X11R6/lib && ln -s libgtk-12.so libgtk12.so
421+[]# cd /usr/X11R6/lib && ln -s libgdk-12.so libgdk12.so
422+```
393423
394424**NetBSD**
395425As source based distro's, and also make sure you have -Fl/usr/pkg/lib in your fpc.cfg and/or Lazarus library path
396426
397427### How can I convert a kylix 2 project into a lazarus project?
398428
399429Nearly the same way as converting a Kylix project into a Delphi/VCL project.
400430
401431The LCL (Lazarus Component Library) tries to be compatible to Delphi's VCL. Kylix's CLX tries to be QT compatible. Here are some general hints:
402432
403433- Rename all used CLX Q-units like QForms, QControls, QGraphics, ... into their VCL counterparts: Forms, Controls, Graphics, ...
404434- Add LResources to the uses section of every form source
405435- Rename or copy all .xfm files to .lfm files.
406436- Rename or copy .dpr file to .lpr file.
407437- Add "Interfaces" to the uses section in the .lpr file.
408438- Remove {\$R *.res} directive
409439- Remove {\$R *.xfm} directive
410440- Add {\$mode objfpc}{\$H+} or {\$mode delphi}{\$H+} directive to .pas and .lpr files
411441- Add an initialization section to the end of each form source and add an include directive for the .lrs file (lazarus resource file):
412442
413-` initialization`\
414-`   {$I unit1.lrs}`
443+```text
444+ initialization
445+ {$I unit1.lrs}
446+```
415447
416448
417449The .lrs files can be created via the lazres tool in: (lazarusdir)/tools/lazres.
418450
419451For example: ./lazres unit1.lrs unit1.lfm
420452
421453- Fix the differences. The LCL does not yet support every property of the VCL and the CLX is not fully VCL compatible.
422454
423455- To make it more platform independant, reduce unit libc (which is deprecated) references and substitute with native FPC units like baseunix/unix as much as possible. This will be necessary to support other targets than linux/x86 (including OS X, FreeBSD and Linux/x86_64)
424456
425457### When compiling lazarus the compiler can not find a unit. e.g.: gtkint.pp(17,16) Fatal: Can't find unit GLIB
426458
4274591\. Check a clean rebuild: do a 'make clean all'
428460
4294612\. Check if the compiler has the correct version (2.0.4 or higher)
430462
4314633\. Check if the compiler is using the right config file. The normal installation creates /etc/fpc.cfg. But fpc also searches for ~/.ppc386.cfg, ~/.fpc.cfg, /etc/ppc386.cfg and it uses only the first it finds.
432464
433465
434466**Hint:** You can see which config file is used with 'ppc386 -vt bogus'
435467
436468Remove any ppc386.cfg as it is really obsolete.
437469
4384704\. Check if the config file (/etc/fpc.cfg) contains the right paths to your fpc libs. There must be three lines like this:
439471
440-`   -Fu/usr/lib/fpc/$fpcversion/units/$fpctarget`\
441-`   -Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/rtl`\
442-`   -Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/*`
472+```text
473+ -Fu/usr/lib/fpc/$fpcversion/units/$fpctarget
474+ -Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/rtl
475+ -Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/*
476+```
443477
444478
445479The first part of these paths (/usr/lib/fpc) depends on your system. On some systems this can be for example /usr/local/lib/fpc/... .
446480
447481**Hint:** You can see your searchpaths with 'ppc386 -vt bogus'
448482
4494835\. Check that the config file (/etc/fpc.cfg) does not contain search paths to the lcl source files (.pp, .pas):
450484
451-` forbidden: -Fu(lazarus_source_directory)/lcl`\
452-` forbidden: -Fu(lazarus_source_directory)/lcl/interfaces/gtk`
485+```text
486+ forbidden: -Fu(lazarus_source_directory)/lcl
487+ forbidden: -Fu(lazarus_source_directory)/lcl/interfaces/gtk
488+```
453489
454490
455491If you want to add the lcl for all your fpc projects, make sure that the two paths look like the following and are placed after the above fpc lib paths:
456492
457-` -Fu(lazarus_source_directory)/lcl/units/$fpctarget`\
458-` -Fu(lazarus_source_directory)/lcl/units/$fpctarget/gtk`
493+```text
494+ -Fu(lazarus_source_directory)/lcl/units/$fpctarget
495+ -Fu(lazarus_source_directory)/lcl/units/$fpctarget/gtk
496+```
459497
4604986\. Check if the missing unit (glib.ppu) exists in your fpc lib directory. For example the gtk.ppu can be found in /usr/lib/fpc/\$fpcversion/units/i386-linux/gtk/. If it does not exists, the fpc lib is corrupt and should be reinstalled.
461499
4625007\. Check if the sources are in a NFS mounted directory. In some cases the NFS updates created files incorrectly. Please, try to move the sources into a non NFS directory and compile there.
463501
4645028\. If you are still not succeeded try to use samplecfg script as follows:
465503
466504*\#* cd /usr/lib/fpc/*version*/
467505
468506*\#* sudo ./samplecfg /usr/lib/fpc/*\\\$version* /etc
469507
470508Note! Do not put - / - after etc because if you do that the system will create a file - /etc/fpc.cfg/fpc.cfg. In fact we want that samplecfg make a file - /etc/fpc.cfg - not the folder /etc/fpc.cfg.
471509
472510### I have installed the binary version, but when compiling a simple project, lazarus gives: Fatal: Can't find unit CONTROLS
473511
474512Probably you are using a newer fpc package, than that used for building the lazarus binaries. The best solution is to download the sources and compile lazarus manually. You can download the source snapshot or get the source via svn:
475513
476-` $ bash`\
477-` $ svn checkout `[`http://svn.freepascal.org/svn/lazarus/trunk`](http://svn.freepascal.org/svn/lazarus/trunk)` lazarus`\
478-` $ cd lazarus`\
479-` $ make clean all`
514+```text
515+ $ bash
516+ $ svn checkout http://svn.freepascal.org/svn/lazarus/trunk lazarus
517+ $ cd lazarus
518+ $ make clean all
519+```
480520
481521Make sure that lazarus get the new source directory: Environment-\>General Options-\>Files-\>Lazarus Directory Top
482522
483523### Lazarus компилируется, но компоновка прерывается с ошибкой: libgdk-pixbuf not found
484524
485525Для решения проблемы нужно установить библиотеку gdk-pixbuf library для gtk1.x:
486526
487527Библиотека gdk-pixbuf может быть найдена:
488528
489529RPM пакет: <http://rpmfind.net/linux/rpm2html/search.php?query=gdk-pixbuf&submit=Search+>...&system=&arch=
490530
491531Debian пакет: libgdk-pixbuf-dev
492532
493533Исходники: <ftp://ftp.gnome.org/pub/gnome/unstable/sources/gdk-pixbuf/>
494534
495535**Ubuntu 8.10:**
496536
497537Если вы собираете Lazarus с GTK 2.0 вы можете получить ошибку "libgdk-pixbuf2.0 not found" . Для решения проблемы просто установите пакет libgtk2.0-dev, используя команду apt следующим образом (используйте sudo при необходимости):
498538
499-`apt-get install libgtk2.0-dev`
539+```text
540+apt-get install libgtk2.0-dev
541+```
500542
501543### Я использую SuSE, при компиляции получаю ошибку: "/usr/bin/ld: cannot find -lgtk Error: Error while linking"
502544
503545Ранние версии SuSE (до SuSE 11) устанавливали gtk библиотеки devel в директорию /opt/gnome/lib (или /opt/gnome/lib64 для 64-й версии), что не является общепринятым путём для библиотек.
504546
505547Для решения проблемы, вы можете добавить этот путь библиотеки в конфигурационный файл FPC (/etc/fpc.cfg), следующей строкой:
506548
507-`-Fl/opt/gnome/lib.`
549+```text
550+-Fl/opt/gnome/lib.
551+```
508552
509553### Лазарус после установки компонента падает с ошибкой runtime error 211
510554
511555После установки компонента Лазарус падает со следующей ошибкой:
512556
513-`Threading has been used before cthreads was initialized.`\
514-`Make cthreads one of the first units in your uses clause.`\
515-`Runtime error 211 at $0066E188`
557+``` pascal
558+Threading has been used before cthreads was initialized.
559+Make cthreads one of the first units in your uses clause.
560+Runtime error 211 at $0066E188
561+```
516562
517563Как это исправить?
518564
519565Установленный компонент использует потоки. FPC не включает поддержку многопоточности автоматически на *nix системах, по-этому её необходимо включать вручную. Её включение происходит использованием модуля cthreads. Любое приложение, использующее такой компонент должна использовать этот модуль, причём он должен быть первым подключаемым модулем в программе. Лазарус так же не является исключением.
520566
521567Подключить модуль cthreads можно двумя способами:
522568
5235691\) Откройте пакет. В редакторе пакетов нажмите на *Параметры (Options)*. Во вкладке *Использование (Usage)* добавьте настройку*Пользовательские (custom)* и запишите **-dUseCThreads**. Пересоберите Лазарус. В этом случае модуль cthreads подключиться автоматически для unix систем.
524570
5255712\) Чтобы не изменять пакет, можно добавить директиву компиляци при сборке самого Лазаруса. Откройте меню Сервис(Tools)-\>Параметры сборки Lazarus(Configure "build Lazarus)". В диалоге Параметры "Cборки Lazarus"("build Lazarus") в поле "Параметры:"("Options:") впишите -Facthreads и нажмите кнопку "OK". После этого добавьте пакет и пересоберите среду.
526572
527573*Совет:* Предыдущая копия Лазаруса (исполнительный файл, который при запуске на выдавал ошибку), скорее всего, находится в той же папке что и текущая версия, но с расширением .old.
528574
529575См.также:[[Multithreaded Application Tutorial/ru|Модули, необходимые для мультипоточных приложений]]
530576
531577### Когда я запускаю программу, использующую потоки (threads), я получаю сообщение об ошибке "runtime error 232"
532578
533579Полное сообщение выглядит так:
534580
535-`This binary has no thread support compiled in.`\
536-`Recompile the application with a thread-driver in the program uses`\
537-`clause before other units using thread.`\
538-`Runtime error 232`
581+``` pascal
582+This binary has no thread support compiled in.
583+Recompile the application with a thread-driver in the program uses
584+clause before other units using thread.
585+Runtime error 232
586+```
539587
540588**Решение**: Добавьте модуль cthreads в секцию uses главного модуля вашей программы (обычно это .lpr-файл).
541589
542590### У меня Ubuntu Breezy/Mandriva KDE3 и шрифты в Lazarus IDE выглядят слишком большими
543591
544592Попробуйте следующее: Создайте файл с именем «.gtkrc.mine» в домашней директории (если он не существует) и внесите в него данный текст:
545593
546594 style "default-text" {
547595 fontset = "-*-arial-medium-r-normal--*-100-*-*-*-*-iso8859-1,\
548596 -*-helvetica-medium-r-normal--*-100-*-*-*-*-*-*"
549597 }
550598
551599 class "GtkWidget" style "default-text"
552600
553601Если это не сработает, попробуйте создать ссылку .gtkrc на .gtkrc.mine. Данный способ был опробован в Xubuntu 7.10 и Mandriva 2009.0 KDE3
554602
555603**Примечание:** Если Lazarus был скомпилирован с использованием библиотеки Gtk1.2, то настройка шрифтов в Gtk2 не будет влиять на отображение текста в нём.
556604
557605### Как подключать и использовать сторонние файлы ресурсов (*.rc) в GTK приложении?
558606
559607Вариант 1. Переименуйте файл ресурсов (rc) *мой_ресурс.rc* в *имя_программы.gtkrc* и поместите в папку с исполняемым файлом программы.
560608
561609Вариант 2. Подключите модуль *GtkInt* в секцию *uses* исходного кода проекта (*.lpr), и допишите код
562610
563611``` pascal
564612{$IFDEF LCLGtk}
565613 GTKWidgetSet.SetRCFilename('имя_вашего_файла_ресурса');
566614{$ENDIF LCLGtk}
567615```
568616
569617перед вызовом *Application.Initialize*.
570618
571619Вариант 3. Используя модуль *gtk2* вызовите метод *gtk_rc_parse('имя_файла_ресурса')* а также *gtk_rc_reparse_all*.
572620
573621### I have Ubuntu and I cannot compile for Gtk2 due to missing libraries
574622
575623Ubuntu has a problem with not creating all the symbolic links that you'll need even when the libraries are installed. Make sure that all missing libraries when trying to link for Gtk2 have their appropriate links. For instance, you might need to do:
576624
577625 cd /usr/lib
578626 sudo ln -s libgdk-x11-2.0.so.0 libgtk-x11-2.0.so
579627
580628Make sure that the \[whatever\].so symbolic links are created and point to the actual libraries.
581629
582630### How can I compile a program for Gtk2?
583631
584632At the moment, the Gtk2 compiled IDE is a little unstable, but you can compile software for Gtk2 using the Gtk1 IDE.
585633
586634To start with recompile LCL for Gtk2. Go to the menu "Tools"-\>"Configure Build Lazarus" and set LCL to clean+build and everything else to none.
587635
588636Now click Ok and go to the menu "Tools"-\>"Build Lazarus"
589637
590638Now you can compile your software with Gtk2 going on the Compiler options and changing the widgetset to Gtk2.
591639
592640### I get this message: "\[WARNING\] ** Multibyte character encodings (like UTF8) are not supported at the moment."
593641
594642Since revision 10535 (0.9.21) this message doesn't exist anymore. Previously it was used to warn that a UTF-8 encoding was used. The internal keyhandling routines for the gtk1 widgetset couldn't handle such encoding for keypresses, with the result that keypresses with for instance accented chars were not or wrong detected.
595643
596644(original text for older versions of lazarus)\
597645This warning message indicates that your locale enconding is set to utf-8. If you are using Gtk 1 this can be a serious problem and prevent the correct working of Lazarus or software created with Lazarus.
598646
599647To work around this, just change your locale to a non utf-8 before executing the program on the command line, like this:
600648
601649 export LC_CTYPE="pt_BR"
602650 export LANG="pt_BR"
603651 export LANGUAGE="pt_BR"
604652 ./lazarus
605653
606654Substitute pt_BR with the locale for your country. You can create a script to automate this.
607655
608656## Windows
609657
610658### When I cycle the compiler, I get:The name specified is not recognized as an internal or external command, operable program or batch file.\>& was unexpected at this time.
611659
612660In the compiler directory there is an OS2 scriptfile named make.cmd. Different versions of Windows also see this as a script file, so remove it since what is needed for OS2 becomes a hindrance on Windows.
613661
614662### When I cycle the compiler, I get: make\[3\]: ./ppc1.exe: Command not found
615663
616664I don't know why but somehow make has lost its path. Try to cycle with a basedir set like: make cycle BASEDIR=your_fpc_source_dir_herecompiler
617665
618666### When I try to make Lazarus I get:
619667
620668#### make.exe: * * * interfaces: No such file or directory (ENOENT). Stop.make.exe: * * * \[interfaces_all\] Error 2
621669
622670You need to upgrade your make.
623671
624672#### makefile:27: *** You need the GNU utils package to use this Makefile. Stop.
625673
626674Make sure you didn't install FPC in a path with spaces in the name. The Makefile doesn't support it.
627675
628676### How can I give my program an XP look like lazarus has?
629677
630678Project -\> Project Options -\> Check 'Use manifest to enables themes'.
631679
632680### Когда я запускаю Windows программу, созданную в Lazarus-е, открывается консольное (DOS) окно
633681
634682Укажите параметр -WG (Windows графическое приложение) в командной строке компилятора или установите флажок
635683
636-`Проект->Опции проекта->Параметры компилятора -> Связывание -> Графическое приложение Win32 `
684+```text
685+Проект->Опции проекта->Параметры компилятора -> Связывание -> Графическое приложение Win32
686+```
637687
638688англ:
639689
640-`Project->Project Options-> Compiler Options -> Linking -> Win32 GUI application.`
690+```text
691+Project->Project Options-> Compiler Options -> Linking -> Win32 GUI application.
692+```
641693
642694## Mac OS X
643695
644696### Why does compiling a project fail with 'unknown section attribute: no_dead_strip'?
645697
646698Dead code stripping is not supported by the assembler and linker before Xcode 1.5 (available for Mac OS X 10.3.9). Disable the compiler options
647699
648700- Code \> Unit style \> Smart linkable (-CX)
649701- and Linking \> Link Style \> Link smart (-XX)
650702
651703## Лицензирование
652704
653705### Могу ли я создавать коммерческие приложения, используя Lazarus?
654706
655707Да, библиотека LCL разрабатывается под лицензией LGPL, что позволяет использовать её без открытия кода вашего приложения. Однако, модификации и расширения LCL должны распространяться с исходным кодом. Сам Lazarus, как IDE, использует лицензию GPL. Отметим, что LCL - это код, содержащийся в файлах из каталога "lcl", прочий код не подпадает под действие указанной лицензии.
656708
657709### Могу ли использовать в коммерческих приложениях дополнительные компоненты Lazarus?
658710
659711В составе Lazarus есть дополнительные компоненты, разработанные участниками сообщества. Некоторые из этих компонентов распространяются под лицензиями, отличными от лицензии самого Lazarus. Если вы используете такие компоненты, вы должны уточнить их лицензию. Обычно необходимое пояснение приводится в исходном коде файлов соответствующего пакета. Большинство дополнительных компонентов от сторонних разработчиков можно найти в подкаталоге "components" основного каталога Lazarus.
660712
661713### Как я могу узнать, что компонент является частью LCL?
662714
663715Все модули LCL размещаются в подкаталоге "lcl". Также доступен [список модулей](http://lazarus-ccr.sourceforge.net/docs/lcl/), входящих в LCL. Если в вашем коде вызываются модули, которых нет в этом списке, вероятно, вы используете компонент, не являющийся частью LCL.
664716
665717### Могу ли я создавать коммерческие плагины для Lazarus?
666718
667719Да, the IDEIntf part of the IDE is licensed under the LGPL with the same exception, so that shared data structures in this part will not force you to license your plug-in or design-time package under the GPL. You are free to choose a plug-in of any license; we don't want to limit your choice. Therefore non-GPL compatible plug-ins are allowed. Note that it's not allowed to distribute a precompiled Lazarus with these non-GPL-compatible plugins included statically; however, we do not see this as a severe limitation, since recompiling Lazarus is easy.
668720
669721---
670722*From the Free Pascal wiki, page "Lazarus Faq/ru", as it stood on 2020-02-18 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history