Sign in Join
Wiki copytemporary

Lazarus Faq/ru: what changed

Revision 1 to 2. 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
33-<figure>
34-<img src="Lazarus_vs_cpp.png" title="Lazarus_vs_cpp.png" />
35-<figcaption>Lazarus_vs_cpp.png</figcaption>
36-</figure>
33+![](/wiki-images/d/de/Lazarus_vs_cpp.png)
3734
3835**Краткое руководство по уменьшению размера Lazarus/FPC приложения** *(проверено в Lazarus 0.9.26)*
3936
4037- 1\. Project\|Compiler Options\|Code\|Smart Linkable (-CX) -\> Поставить галочку
4138- 2\. Project\|Compiler Options\|Linking\|Debugging\|Display Line Numbers in Run-time ErrorBacktraces (-gl) -\> Убрать галочку
4239- 3\. Project\|Compiler Options\|Linking\|Debugging\|Strip Symbols From Executable (-Xs) -\> Поставить галочку
4340- 4\. Project\|Compiler Options\|Linking\|Link Style\|Link Smart (-XX) -\> Поставить галочку
4441
4542Самые важные элементы, мне кажется, 2 и 3. Для простого приложения выполнимый размер должен теперь составить 1-3 Мбайта вместо 15-20 Мбайт. В этом пункте Вы можете также попробовать: Project\|Compiler Options\|Code\|Optimizations\|smaller, вместо Faster -\> Поставить галочку (Предупреждение: это может уменьшить производительность),
4643
4744- 5\. (Опционально) Запустите UPX \<путь к исполняемому файлу\> для сжатия вашего бинарника дополнительно в 2-3 раза (Предупреждение: как сказано выше, есть недостатки в использовании UPX).
4845
4946### УСТАРЕЛО: Почему компоновка такая медленная в Windows?
5047
5148Эта проблема свойственна лишь старым версиям: FPC 2.2 и Lazarus 0.9.24. Пожалуйста обновите Лазарус. Всё написанное здесь относится **только** к старым версиям.
5249
5350В общем, компоновка на Windows занимает больше времени, чем на других платформах, потому что GNU компоновщик под эту операционную систему очень медленный. FPC (2.2) использует этот компоновщик при сборке программ. Эта проблема возникает только на Windows и только на слабых компьютерах (с процессором частотой менее 1ГГц и/или оперативной памятью меньше 128 Мегабайт)
5451
5552Также, если вы используете умную компоновку (smartlinking), общее время компиляции так же увеличиться. Подробнее об этом можно прочитать здесь: [[File size and smartlinking]]
5653
5754Для решения этой проблемы, был разработан внутренний компоновщик. Он есть во всех версиях FPC, начиная с 2.2. Его использование позволило в значительной степени сократить общее время компиляции. Внутренний компоновщик используется только при компиляции для Windows системы.
5855
5956### Мне нужен ppc386.cfg или fpc.cfg?
6057
6158Вам нужен только fpc.cfg. В нем указаны пути, по которым компилятор будет искать библиотеки.
6259
6360### Как я могу скомпилировать lazarus?
6461
6562Нет ничего проще :)
6663
6764`$ cd lazarus`\
6865`$ make clean all`
6966
7067### Как собирать LCL проекты без Lazarus-а?
7168
7269- В тех случаях, когда использование графической среды невозможно, вы можете воспользоваться утилитой командной строки: lazbuild.
7370
7471Эта утилита используется для сборки проектов и lazarus-пакетов (packages).
7572
7673- Если вам нужно собрать LCL приложение без среды разработки и не используя lazbuild, вам необходимо добавить следующие строки в файл *fpc.cfg*
7774
7875`  # строчки начинающиеся с # можно не добавлять`\
7976`  # это комментарии`\
8077`  # пути для других модулей и компонентов `\
8178` -Fu{Путь_к_лазарусу}/lcl/units/{целевая_система}`\
8279` -Fu{Путь_к_лазарусу}/components/units/{целевая_система}`
8380
8481
8582Где {целевая_система} это системный префикс, указывающий для какой системы располагаются модули. Обычно этот префикс представляет собой пару имён "Процессор-ОСь", например i386-win32, i386-linux, i386-darwin.:
8683
8784После добавления этих строк в конфигурационный файл, вызовете команду: fpc myproject.lpr myproject.lpr это имя основного файла проекта (модуль начинающийся с "program" или "library"). Но имя может быть другим, т.к. Лазарус не принуждает Вас использовать расширение .lpr.
8885
8986Кроме того, если Ваш проект использует какие-либо особые настройки, вы можете получить командную строку для компиляции, используя меню в Лазарусе: *Проект-\>Параметры проекта...-\>Показать параметры* (параметров может быть очень много, удобно скопировать их в отдельный скрипт файл .bat или .sh);
9087
9188### Какая версия FPC требуется?
9289
9390Версия 2.4.0 для всех операционных систем.
9491
9592### Я не могу скомпилировать Lazarus
9693
97941. Проверьте версию компилятора
98952. Проверьте версию (fpc)библиотек, они должны быть той же версии
99963. Проверьте путь установки компилятора на наличие в нем пробелов. Пробелов в нем не должно быть!
100974. Проверьте наличие файла fpc.cfg, а не старого файла ppc386.cfg
101985. Проверьте также OS-dependent FAQs
10299
103100### При компиляции проекта возникает ошибка:
104101
105102#### "Cannot find Unit interfaces". Как можно это исправить?
106103
107104Ошибка возникает потомучто компилятор не может найти 'interfaces.ppu' **или** он найден, но он поврежден, неправильной версии или просрочен.
108105
109106Этот модуль может находиться в {LazarusDir}\lcl\units\\{TargetCPU}-{TargetOS}\\{LCLWidgetSet}\interfaces.ppu. Например: /home/username/lazarus/lcl/units/i386-linux/gtk/interfaces.ppu.
110107
111108Убедитесь, что он только здесь. Если находятся несколько версий interfaces.ppu, то вы возможно получите неверную конфигурацию (к примеру добавлен каталог lcl в список путей поиска). Удалите все interfaces.ppu, оставьте только тот что в каталоге указаном выше.
112109
113110Если вы выберете другой widgetset, то при пересборке lazarus, понадобится пересобрать LCL для этого widgetset.
114111
115112Если ошибка возникает несмотря на то что 'interfaces.ppu' на месте - значит используется, иная compiler/rtl для компиляции проекта нежели для компиляции Lazarus IDE. Можно сделать одно из следующего:
116113
117114- Пересобрать LCL (или полностью Lazarus) с компилятором выбраным в Environmnent Options. Для этого можно кликнуть Tools -\> Build Lazarus. Перед этим проверьте текущие настройки в Tools -\> Configure Build Lazarus.
118115- Поменять компилятор в Environment Options на тот что используется для компиляции Lazarus. Посмотрите внимательно также в Environment Options что используются корректный путь к каталогу Лазаря (Lazarus Directory) и к исходникам FPC. Убедитесь что есть только только один файл конфигурации fpc.cfg - он должен располагаться /etc/ для Linux/Unix или вместе с компилятором fpc под Windows. Попробуйте запустить "fpc -vt bogus" для того чтобы увидеть какой fpc.cfg используется на вашей системе. Мешающие копии обычно появляются при обновлении компилятора; они могут находится в домашнем каталоге или вместе с пересобраным новым компилятором. УДАЛИТЕ ИХ!!
119116- Можно также попробовать сменить текущий widgetset проекта. Например, примерный проект "objectinspector" поставляемый с Лазарем поумолчанию использует gtk. Компиляция этого проекта наверняка выдаст "Can't find unit interfaces" под Windows. Смена widgetset на default(Win32) в Project \| Compiler Options... \| LCL Widget Type (various) должно исправить это.
120117
121118### Когда я пытаюсь откомпилировать проект Delphi в lazarus, я получаю сообщение об ошибке
122119
123120#### Ошибка на строке :{\$R *.DFM}. Как мне решить эту проблему?
124121
125122Lazarus (а точнее - Linux) не знает о таком понятии, как "ресурсы", и не может использовать некоторые связанные с ними понятия, пришедшие из Delphi/Win32. Однако, Lazarus использует методы, обеспечивающие совместимость с этими понятиями. Вы сможете использовать формы Delphi (файлы .dfm), если выполните следующие шаги:
126123
127124- Используйте текстовые версии .dfm-файлов. D5 и более поздние версии используют такие файлы по умолчанию. Если у вас более старые файлы, выполните следующее: нажмите ALT-F12 для просмотра кода формы в виде текста и скопируйте/вставьте текст. Если у вас есть текстовый .dfm-файл, просто скопируйте его содержание в .lfm-файл.
128125- Создайте файл с помощью lazres (в меню lazarus/tools) следующей командой: lazres yourform.lrs yourform.lfm
129126- Добавьте следующую строку в секцию initialization:
130127
131128`     initialization`\
132129`     {$I yourform.lrs}`
133130
134131Пожалуйста, помните, что не все свойства объектов, описанные в dfm-файлах, поддерживаются Lazarus, и часть из них может вызвать падения IDE.
135132
136133Примечание: Вы не получите этой ошибки, начиная с версии Lazarus 0.9.29 (SVN) при использовании FreePascal 2.4.0 и выше. Компилятор этой версии умеет включать такие ресурсы в исполняемый файл на всех платформах. Тем не менее, проблема несовместимости отдельных свойств от этого не исчезает.
137134
138135#### Ошибка: 'Identifier not found LazarusResources'.
139136
140137При создании формы Lazarus автоматически добавляет некоторые необходимые модули в секцию uses вашего модуля, содержащего форму. После конвертации из Delphi в модуле могут отсутствовать необходимые ссылки. В данном конкретном случае вам необходимо добавить в секцию uses модуль LResources.
141138
142139### При обращении к событиям объектов, например OnClick объекта button, я получаю следующую ошибку: ERROR unit not found: stdCtrls
143140
144141Убедитесь (Project -\> Project Inspector),что ваш проект зависит от пакета 'LCL' и что вы установили исходники FPC.
145142
146143Lazarus - это IDE (среда разработки) и библиотека визуальных компонентов LCL. Все другие вещи, как IO, Database, FCL и RTL предоставляются FPC. IDE нужны пути ко всем исходникам.
147144
148145Пути к исходникам FPC могут быть установлены через: Environment -\> Environment Options -\> Files -\> FPC source directory (Окружение -\> Параметры -\> Файлы -\> Каталог исходного кода FPC).
149146
150147### Как внедрять содержимое небольшого файла в исполняемый файл? Как внедрять ресурсы?
151148
152149Например,
153150
154151`/your/lazarus/path/tools/lazres sound.lrs sound1.wav sound2.wav ...`
155152
156153создаст sound.lrs из sound1.wav и sound2.wav.
157154
158155Потом включите его *после* lrs-файла формы:
159156
160157`...`\
161158`initialization`\
162159`{$i unit1.lrs} // this is main resource file (first)`\
163160`{$i sound.lrs} // user defined resource file`\
164-\
161+
165162`end.`
166163
167164В Вашей программе эти ресурсы можно использовать следующим образом:
168165
169166`Sound1AsString:=LazarusResources.Find('sound1').Value;`
170167
171168### Что означают различные расширения файлов, используемые Lazarus?
172169
173170Глава [[Lazarus Tutorial|Lazarus Tutorial#The Lazarus files]] разъясняет назначение некторых расширений. Вот их краткий список:
174171
175172`*.lpi`
176173файл с информацией о проекте Lazarus (в формате XML; содержит настройки, относящиеся к конкретному проекту)
177174
178175`*.lpr`
179176программный файл Lazarus; содержит основной Pascal-код программы
180177
181178`*.lfm`
182179файл формы Lazarus; содержит информацию обо всех объектах, размещённых на форме (хранится в специальном текстовом формате; связанные с объектами формы действия хранятся в одноимённом `*.pas`-файле)
183180
184181`*.pas` или `*.pp`
185182модуль с Pascal-кодом (обычно связан с формой в одноимённом `*.lfm`-файле)
186183
187184`*.lrs`
188185файл ресурсов Lazarus (это генерируемый файл; не является файлом ресурсом Windows).
189186
190187Этот файл может быть создан с помощью утилиты lazres (в каталоге Lazarus/Tools) путё вызова из командной строки: lazres myfile.lrs myfile.lfm
191188
192189`*.ppu`
193190скомпилированный модуль
194191
195192`*.lpk`
196193информационный файл для пакета Lazarus (в формате XML; содержит настройки, относящиеся к конкретному пакету)
197194
198195### Когда я пишу *var mytext: text;*, чтобы объявить текстовый файл, я получаю ошибку "Unit1.pas(32,15) Error: Error in type definition". Как можно это исправить?
199196
200197Класс TControl содержит свойство [[doc:lcl/controls/tcontrol.text.html|Text]]. В методе формы используется тип[[doc:rtl/system/text.html|Text]] из модуля system. Вы можете использовать тип [[doc:rtl/system/text.html|TextFile]], который всего лишь является другим названием типа Text, или можете добавить модуль при объявлении (см. в примере):
201198
202199`  var`\
203200`  MyTextFile: TextFile;`\
204201`  MyText: System.Text;`
205202
206203Сходный конфликт имен существует и при связывании и закрытии текстового файла. 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).
207204
208205### Я получаю ошибку при использовании Printer.BeginDoc
209206
210207Модуль Printers должен быть добавлен в секцию uses.
211208
212209Пакет Printer4Lazarus должен быть добавлен в зависимости Вашего проекта в IDE: Project\|Project Inspector\|Add\|New Requirement\|Package Name:
213210
214211Если пакета Printer4Lazarus нет в списке пакетов, то Вам нобходимо установить его. Пакет является частью установки Lazarus и может быть найден по следующему пути: \[каталог установки lazarus\]\components\printers
215212
216213Если Вы используете стандартный путь для установки Lazarus'а, то \[каталог установки larazus\] находится:
217214
218215- Windows: c:\lazarus
219216- Linux: /usr/lib/lazarus
220217
221218Данное решение также применимо, если Вы получаете исключения при использовании Printer.Printers
222219
223220### Почему TForm.ClientWidth/ClientHeight - это то же самое, что и TForm.Width/Height?
224221
225222TForm.Width/Height не включают границ окна, поскольку не существует способа получить размер этих границ на всех платформах. Без надёжного способа LCL будет перемещать формы по всему экрану или бесконечно изменять их размер.
226223
227224В конечном итоге, когда появится надёжный способ получения размера и позиции окна вместе с его границами для всех платформ, это будет изменено. Для сохранения совместимости со старыми LCL-формами, будет введён номер версии и использованы некоторые другие дополнительные методы.
228225
229226## Отладка
230227
231228### Как увидеть отладочные сообщения?
232229
233230В модуле LCLProc в LCL есть две процедуры для вывода отладочных сообщений. Они называются:
234231
235232- **DebugLn:** которая работает также, как WriteLn, но принимает только строки.
236233- **DbgOut:** которая работает также, как Write, но принимает только строки.
237234
238235В обычных условиях сообщения выводятся в stdout. Если stdout закрыт (например когда приложение {\$AppType Gui} или откомпилировано с ключом -WG под Windows), сообщения не выводятся никуда.
239236
240237Отладочные сообщение могут также выводится в файл. Код инициализации модуля LCLProc проверяет командую строку Lazarus.exe's на предмет наличия ключа '--debug-log=\<file\>'. Если этот ключ присутствует - весь последующий отладочный вывод направляется в \<file\>.
241238
242239Если этого ключа нет, проверяется существование системной переменной окружения xxx_debuglog, где xxx - имя файла программы без расширения. Для Lazarus это будет lazarus_debuglog. Если такая переменная окружения существует, файл указанный в ней будет использован для вывода отладочных сообщений. Пример: если вы сделаете:
243240
244241`set lazarus_debuglog=c:\lazarus\debug.txt`
245242
246243то отладочные сообщения будут выводится в c:\lazarus\debug.txt.
247244
248245Так как это реализовано в lclproc, любое приложение использующее lclproc может использовать этот механизм вывода отладочных сообщений.
249246
250247Отладка Lazarus-а
251248Наиболее полезно для Windows: Если вы хотите выводить сообщения в консоль, добавьте {\$APPTYPE console} в lazarus.pp ; После чего перекомпилируйте Lazarus.
252249
253250### Как мне просмотреть значение свойств?
254251
255252Вам нужно использовать самую последнюю версию FPC из исходников (2.5.1) или релиз 2.4.0. Любая версия позднее указанных, так же подойдёт.
256253
257254Если Вы скомпилируете приложение, использую ключ -gw (отладочная информация dwarf), Вы сможете просмотреть значения свойств.
258255
259256**Внимание:** это возможно, только для тех свойст, которые напрямую связан с членом класса, директива "read" указывает на переменную, а не метод.
260257
261258Если свойство возвращает значение через функцию, то достаточно опасно проверять её значение. Риск заключается в том, что для проверки её значения требуется вызвать процедуру или функцию, что может привести к изменению других значений и/или данных. А это значит, что данные изменились в режиме отладки, и дальнейшее исполнение программы, будет отличаться от работы без отладчика.
262259
263260Проверка свойства по результату функции (как описана выше), ещё не реализована.
264261
265262### Почему отладчик не показывает некоторые переменные или структуры (выдавая ошибки "no such symbol"/"incomplete type")
266263
267264Для решения проблем с: - свойствами\
268265\- динамическими массивами\
269266\- переменными во вложенных процедурах\
270267\- "no such symbol in context"\
271268\- "incomplete type"\
272269смотри здесь [[GDB Debugger Tips]]
273270
274271### Как я могу проводить отладку компонентов и пакетов FCL с помощью Lazarus
275272
276273Компоненты и классы FCL скомпилированны по умолчанию без отладночной информации. Как результат - gdb не моэет получить доступ к методам и свойствам этих объектов. Для пересборки компонентов FCL необходимо включить ключ компилятора "-gl" для генерации отладочной информации.
277274
278275Этот пример предпологает, что у вас Linux дистрибутив с установленным FPC в папке /usr/local/ и вам необходимо включить отладочную информацию для пакета fcl-db. По аналогии с пакетом fcl-db, используемом в данном примере, вы можете применить эти команды для ЛЮБЫХ пакетов, содержащихся в дистрибутиве.
279276
280277В начале, вам необходимо найти путь к установленному FPC проверив ваш конфигурационный файл FPC. Это файл (fpc.cfg) расположен /etc/fpc.cfg. Просмотрите содержимое fpc.cfg определить папку установки. Обратите внимание на строки, начинающиеся с -Fu в fpc.cfg:
281278
282279`-Fu/usr/local/lib/fpc/$fpcversion/units/$fpctarget/*`
283280
284281При создании скрипта для установки модулей в папку INSTALL_PATH/lib/fpc/\$fpcversion/units/\$fpctarget/, вы должны быть уверены, что /usr/local это путь установки FPC, и он должен быть присвоем INSTALL_PREFIX, в противном случае Make-скрипт установи модули в неправильную папку или вообще завершится с ошибкой.
285282
286283**Step 1**: Открыть терминал и набрать терминале\
287284**Step 2**: cd /user/local/share/src/fpc-2.3.1/fpc/fcl-db/\
288285**Step 3**: sudo make clean all install INSTALL_PREFIX=/usr/local OPT=-gl\
289286Замечание: Параметр INSTALL_PREFIX правильно указан для установки модулей. В примере ниже /usr/local - это путь по умолчанию для fpc в Linux, но он может сильно отличаться в других операционных системах
290287
291288`make clean all install INSTALL_PREFIX=/usr/local OPT=-gl`
292289
293290В конце, после пересборки любого FCL пакета, вам возможно необходимо будет пересобрать LCL.
294291
295292## Contributing / Making Changes to Lazarus
296293
297294### Я создал патч для пристыковки окна сообщений IDE к окну "Редактор исходного кода" (снизу)
298295
299296Такие патчи не будут приняты, так как они реализуют лишь малую часть требуемой функциональности стыковки (docking). Цель состоит в создании полноценного менеджера стыковки и его использовании. Полноценный менеджер стыковки(dock manager) может соединять все окна и позволяет пользователю определять, как их стыковать (должно ли окно сообщений быть над или под окном кода ... или вообще быть отделено от него). К примеру:
300297
301298 +-------------------++--+
302299 |menu || |
303300 +-------------------+| |
304301 +--++---------------+| |
305302 |PI|| Source Editor ||CE|
306303 +--+| || |
307304 +--+| || |
308305 | |+---------------++--+
309306 |OI|+-------------------+
310307 | ||messages |
311308 +--++-------------------+
312309
313310Менеджер стыковки может сохранить это расположение и восстановить его при следующем старте. Предпочтительно, если менеджер может работать не только с окнами, но и со страницами редактора кода. Менеджер стыковки не требует использования drag&drop. Все патчи реализующие стыковку без менеджера стыковки усложняют реализацию настоящего менеджера стыковки и потому будут отклонены.
314311
315312В качестве временного решения можно использовать это расширение IDE: [[Manual Docker]]
316313
317314### Я исправил/улучшил Lazarus. Как добавить мои изменения в официальный код Lazarus?
318315
319316Создайте патч и пришлите его разработчикам. Более подробную информацию смотрите здесь [[Creating A Patch/ru]].
320317
321318### How can I become a Lazarus developer and access management in the SVN and bug-tracker?
322319
323320First 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).
324321
325322## Где объявлены ...
326323
327324### Константы виртуальных клавиш
328325
329-Константы виртуальных клавиш (VK_UP, VK_ESCAPE и т.д ) объявлены в [[doc:lcl/lcltype|LCLType]]. Добавьте LCLtype в <b>uses</b> секцию.
326+Константы виртуальных клавиш (VK_UP, VK_ESCAPE и т.д ) объявлены в [[doc:lcl/lcltype|LCLType]]. Добавьте LCLtype в uses секцию.
330327
331328## Использование среды разработки
332329
333330### Как я могу использовать "завершение идентификаторов"?
334331
335332Чтобы вызвать окно завершения идентификатора нажмите \[ctrl\]\[space\] (по умолчанию для Windows и Linux).
336333
337334Вы можете настроить автоматическое появление этого окошка в пункте меню *Окружение-\>Редактор-\>Code Tools-\>Автоматические функции*
338335
339336## Linux
340337
341338### Как выполнить отладку в Linux без IDE?
342339
343340Прежде всего потребуется отладчик. gdb это стандартный отладчик под линукс, имеющий несколько GUI-интерфейсов. Наиболее распространённый интерфейс - ddd - является частью большинства популярных дистрибутивов. Для компиляции lazarus/lcl с информацией для отладчика вам нужно использовать следующие команды для запуска отладочной сессии:
344341
345342` $ make clean; make OPT=-dDEBUG`\
346343` $ ddd lazarus`
347344
348345Однако, следует отметить что ddd не такой удобный как например отладчик Lazarus. Особенно если он используется для просмотра значений имеющихся переменных, учитывая что ddd/gdb регистрозависимы, а Pascal - регистронезависим. Поэтому, чтобы видеть значения переменных, необходимо набирать их имена в верхнем регистре. Для получения более подробной информации обратитесь к fpc-manuals.
349346
350347### I can debug now but ddd does not find my sources or complains that they contain no code. Whats that?
351348
352349This is a path-related problem with either gdb or ddd. You can avoid this by
353350
354351- 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.
355352- In ddd goto \[Edit\] \[gdb-settings\] and set the search-path
356353- Create a \$(HOME)/.gdbinit file like:
357354
358355`     directory /your/path/to/lazarus`\
359356`     directory /your/path/to/lazarus/lcl`\
360357`     directory /your/path/to/lazarus/lcl/include`
361358
362359### I receive an error during the linking that states /usr/bin/ld can't find -l\<some lib\>
363360
364361**Package Based Distributions**
365362You 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).
366363
367364Some distributions have commands to find which package contains a file:
368365
369366**Mandriva**
370367
371368`[]$ urpmf lib<somelib>.so`
372369
373370
374371will list all packages containing the file named lib\<somelib\>.so, you'll have to install those ending in -devel
375372
376373
377374**Debian**
378375
379376
380377install the apt-file utility (apt-get install apt-file) then
381378
382379`[]$ apt-file search lib<somelib>.so`
383380
384381
385382will list all packages containing the file named lib\<somelib\>.so, you'll have to install those ending in -dev
386383
387384**Source Based Distributions and Manual Compilation (LFS)**
388385Make 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).
389386
390387**FreeBSD**
391388As 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:
392389
393390`[]# cd /usr/local/lib && ln -s libglib-12.so libglib12.so`\
394391`[]# cd /usr/X11R6/lib && ln -s libgtk-12.so libgtk12.so`\
395392`[]# cd /usr/X11R6/lib && ln -s libgdk-12.so libgdk12.so`
396393
397394**NetBSD**
398395As source based distro's, and also make sure you have -Fl/usr/pkg/lib in your fpc.cfg and/or Lazarus library path
399396
400397### How can I convert a kylix 2 project into a lazarus project?
401398
402399Nearly the same way as converting a Kylix project into a Delphi/VCL project.
403400
404401The 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:
405402
406403- Rename all used CLX Q-units like QForms, QControls, QGraphics, ... into their VCL counterparts: Forms, Controls, Graphics, ...
407404- Add LResources to the uses section of every form source
408405- Rename or copy all .xfm files to .lfm files.
409406- Rename or copy .dpr file to .lpr file.
410407- Add "Interfaces" to the uses section in the .lpr file.
411408- Remove {\$R *.res} directive
412409- Remove {\$R *.xfm} directive
413410- Add {\$mode objfpc}{\$H+} or {\$mode delphi}{\$H+} directive to .pas and .lpr files
414411- Add an initialization section to the end of each form source and add an include directive for the .lrs file (lazarus resource file):
415412
416413` initialization`\
417414`   {$I unit1.lrs}`
418415
419416
420417The .lrs files can be created via the lazres tool in: (lazarusdir)/tools/lazres.
421418
422419For example: ./lazres unit1.lrs unit1.lfm
423420
424421- Fix the differences. The LCL does not yet support every property of the VCL and the CLX is not fully VCL compatible.
425422
426423- 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)
427424
428425### When compiling lazarus the compiler can not find a unit. e.g.: gtkint.pp(17,16) Fatal: Can't find unit GLIB
429426
4304271\. Check a clean rebuild: do a 'make clean all'
431428
4324292\. Check if the compiler has the correct version (2.0.4 or higher)
433430
4344313\. 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.
435432
436433
437434**Hint:** You can see which config file is used with 'ppc386 -vt bogus'
438435
439436Remove any ppc386.cfg as it is really obsolete.
440437
4414384\. Check if the config file (/etc/fpc.cfg) contains the right paths to your fpc libs. There must be three lines like this:
442439
443440`   -Fu/usr/lib/fpc/$fpcversion/units/$fpctarget`\
444441`   -Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/rtl`\
445442`   -Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/*`
446443
447444
448445The first part of these paths (/usr/lib/fpc) depends on your system. On some systems this can be for example /usr/local/lib/fpc/... .
449446
450447**Hint:** You can see your searchpaths with 'ppc386 -vt bogus'
451448
4524495\. Check that the config file (/etc/fpc.cfg) does not contain search paths to the lcl source files (.pp, .pas):
453450
454451` forbidden: -Fu(lazarus_source_directory)/lcl`\
455452` forbidden: -Fu(lazarus_source_directory)/lcl/interfaces/gtk`
456453
457454
458455If 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:
459456
460457` -Fu(lazarus_source_directory)/lcl/units/$fpctarget`\
461458` -Fu(lazarus_source_directory)/lcl/units/$fpctarget/gtk`
462459
4634606\. 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.
464461
4654627\. 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.
466463
4674648\. If you are still not succeeded try to use samplecfg script as follows:
468465
469466*\#* cd /usr/lib/fpc/*version*/
470467
471468*\#* sudo ./samplecfg /usr/lib/fpc/*\\\$version* /etc
472469
473470Note! 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.
474471
475472### I have installed the binary version, but when compiling a simple project, lazarus gives: Fatal: Can't find unit CONTROLS
476473
477474Probably 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:
478475
479476` $ bash`\
480477` $ svn checkout `[`http://svn.freepascal.org/svn/lazarus/trunk`](http://svn.freepascal.org/svn/lazarus/trunk)` lazarus`\
481478` $ cd lazarus`\
482479` $ make clean all`
483480
484481Make sure that lazarus get the new source directory: Environment-\>General Options-\>Files-\>Lazarus Directory Top
485482
486483### Lazarus компилируется, но компоновка прерывается с ошибкой: libgdk-pixbuf not found
487484
488485Для решения проблемы нужно установить библиотеку gdk-pixbuf library для gtk1.x:
489486
490487Библиотека gdk-pixbuf может быть найдена:
491488
492489RPM пакет: <http://rpmfind.net/linux/rpm2html/search.php?query=gdk-pixbuf&submit=Search+>...&system=&arch=
493490
494491Debian пакет: libgdk-pixbuf-dev
495492
496493Исходники: <ftp://ftp.gnome.org/pub/gnome/unstable/sources/gdk-pixbuf/>
497494
498495**Ubuntu 8.10:**
499496
500497Если вы собираете Lazarus с GTK 2.0 вы можете получить ошибку "libgdk-pixbuf2.0 not found" . Для решения проблемы просто установите пакет libgtk2.0-dev, используя команду apt следующим образом (используйте sudo при необходимости):
501498
502499`apt-get install libgtk2.0-dev`
503500
504501### Я использую SuSE, при компиляции получаю ошибку: "/usr/bin/ld: cannot find -lgtk Error: Error while linking"
505502
506503Ранние версии SuSE (до SuSE 11) устанавливали gtk библиотеки devel в директорию /opt/gnome/lib (или /opt/gnome/lib64 для 64-й версии), что не является общепринятым путём для библиотек.
507504
508505Для решения проблемы, вы можете добавить этот путь библиотеки в конфигурационный файл FPC (/etc/fpc.cfg), следующей строкой:
509506
510507`-Fl/opt/gnome/lib.`
511508
512509### Лазарус после установки компонента падает с ошибкой runtime error 211
513510
514511После установки компонента Лазарус падает со следующей ошибкой:
515512
516513`Threading has been used before cthreads was initialized.`\
517514`Make cthreads one of the first units in your uses clause.`\
518515`Runtime error 211 at $0066E188`
519516
520517Как это исправить?
521518
522519Установленный компонент использует потоки. FPC не включает поддержку многопоточности автоматически на *nix системах, по-этому её необходимо включать вручную. Её включение происходит использованием модуля cthreads. Любое приложение, использующее такой компонент должна использовать этот модуль, причём он должен быть первым подключаемым модулем в программе. Лазарус так же не является исключением.
523520
524521Подключить модуль cthreads можно двумя способами:
525522
5265231\) Откройте пакет. В редакторе пакетов нажмите на *Параметры (Options)*. Во вкладке *Использование (Usage)* добавьте настройку*Пользовательские (custom)* и запишите **-dUseCThreads**. Пересоберите Лазарус. В этом случае модуль cthreads подключиться автоматически для unix систем.
527524
5285252\) Чтобы не изменять пакет, можно добавить директиву компиляци при сборке самого Лазаруса. Откройте меню Сервис(Tools)-\>Параметры сборки Lazarus(Configure "build Lazarus)". В диалоге Параметры "Cборки Lazarus"("build Lazarus") в поле "Параметры:"("Options:") впишите -Facthreads и нажмите кнопку "OK". После этого добавьте пакет и пересоберите среду.
529526
530527*Совет:* Предыдущая копия Лазаруса (исполнительный файл, который при запуске на выдавал ошибку), скорее всего, находится в той же папке что и текущая версия, но с расширением .old.
531528
532529См.также:[[Multithreaded Application Tutorial/ru|Модули, необходимые для мультипоточных приложений]]
533530
534531### Когда я запускаю программу, использующую потоки (threads), я получаю сообщение об ошибке "runtime error 232"
535532
536533Полное сообщение выглядит так:
537534
538535`This binary has no thread support compiled in.`\
539536`Recompile the application with a thread-driver in the program uses`\
540537`clause before other units using thread.`\
541538`Runtime error 232`
542539
543540**Решение**: Добавьте модуль cthreads в секцию uses главного модуля вашей программы (обычно это .lpr-файл).
544541
545542### У меня Ubuntu Breezy/Mandriva KDE3 и шрифты в Lazarus IDE выглядят слишком большими
546543
547544Попробуйте следующее: Создайте файл с именем «.gtkrc.mine» в домашней директории (если он не существует) и внесите в него данный текст:
548545
549546 style "default-text" {
550547 fontset = "-*-arial-medium-r-normal--*-100-*-*-*-*-iso8859-1,\
551548 -*-helvetica-medium-r-normal--*-100-*-*-*-*-*-*"
552549 }
553550
554551 class "GtkWidget" style "default-text"
555552
556553Если это не сработает, попробуйте создать ссылку .gtkrc на .gtkrc.mine. Данный способ был опробован в Xubuntu 7.10 и Mandriva 2009.0 KDE3
557554
558555**Примечание:** Если Lazarus был скомпилирован с использованием библиотеки Gtk1.2, то настройка шрифтов в Gtk2 не будет влиять на отображение текста в нём.
559556
560557### Как подключать и использовать сторонние файлы ресурсов (*.rc) в GTK приложении?
561558
562559Вариант 1. Переименуйте файл ресурсов (rc) *мой_ресурс.rc* в *имя_программы.gtkrc* и поместите в папку с исполняемым файлом программы.
563560
564561Вариант 2. Подключите модуль *GtkInt* в секцию *uses* исходного кода проекта (*.lpr), и допишите код
565562
566563``` pascal
567564{$IFDEF LCLGtk}
568565 GTKWidgetSet.SetRCFilename('имя_вашего_файла_ресурса');
569566{$ENDIF LCLGtk}
570567```
571568
572569перед вызовом *Application.Initialize*.
573570
574571Вариант 3. Используя модуль *gtk2* вызовите метод *gtk_rc_parse('имя_файла_ресурса')* а также *gtk_rc_reparse_all*.
575572
576573### I have Ubuntu and I cannot compile for Gtk2 due to missing libraries
577574
578575Ubuntu 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:
579576
580577 cd /usr/lib
581578 sudo ln -s libgdk-x11-2.0.so.0 libgtk-x11-2.0.so
582579
583580Make sure that the \[whatever\].so symbolic links are created and point to the actual libraries.
584581
585582### How can I compile a program for Gtk2?
586583
587584At the moment, the Gtk2 compiled IDE is a little unstable, but you can compile software for Gtk2 using the Gtk1 IDE.
588585
589586To 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.
590587
591588Now click Ok and go to the menu "Tools"-\>"Build Lazarus"
592589
593590Now you can compile your software with Gtk2 going on the Compiler options and changing the widgetset to Gtk2.
594591
595592### I get this message: "\[WARNING\] ** Multibyte character encodings (like UTF8) are not supported at the moment."
596593
597594Since 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.
598595
599596(original text for older versions of lazarus)\
600-<strike> This 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.
597+This 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.
601598
602599To work around this, just change your locale to a non utf-8 before executing the program on the command line, like this:
603600
604601 export LC_CTYPE="pt_BR"
605602 export LANG="pt_BR"
606603 export LANGUAGE="pt_BR"
607604 ./lazarus
608605
609-Substitute pt_BR with the locale for your country. You can create a script to automate this. </strike>
606+Substitute pt_BR with the locale for your country. You can create a script to automate this.
610607
611608## Windows
612609
613610### 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.
614611
615612In 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.
616613
617614### When I cycle the compiler, I get: make\[3\]: ./ppc1.exe: Command not found
618615
619616I 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
620617
621618### When I try to make Lazarus I get:
622619
623620#### make.exe: * * * interfaces: No such file or directory (ENOENT). Stop.make.exe: * * * \[interfaces_all\] Error 2
624621
625622You need to upgrade your make.
626623
627624#### makefile:27: *** You need the GNU utils package to use this Makefile. Stop.
628625
629626Make sure you didn't install FPC in a path with spaces in the name. The Makefile doesn't support it.
630627
631628### How can I give my program an XP look like lazarus has?
632629
633630Project -\> Project Options -\> Check 'Use manifest to enables themes'.
634631
635632### Когда я запускаю Windows программу, созданную в Lazarus-е, открывается консольное (DOS) окно
636633
637634Укажите параметр -WG (Windows графическое приложение) в командной строке компилятора или установите флажок
638635
639636`Проект->Опции проекта->Параметры компилятора -> Связывание -> Графическое приложение Win32 `
640637
641638англ:
642639
643640`Project->Project Options-> Compiler Options -> Linking -> Win32 GUI application.`
644641
645642## Mac OS X
646643
647644### Why does compiling a project fail with 'unknown section attribute: no_dead_strip'?
648645
649646Dead 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
650647
651648- Code \> Unit style \> Smart linkable (-CX)
652649- and Linking \> Link Style \> Link smart (-XX)
653650
654651## Лицензирование
655652
656653### Могу ли я создавать коммерческие приложения, используя Lazarus?
657654
658655Да, библиотека LCL разрабатывается под лицензией LGPL, что позволяет использовать её без открытия кода вашего приложения. Однако, модификации и расширения LCL должны распространяться с исходным кодом. Сам Lazarus, как IDE, использует лицензию GPL. Отметим, что LCL - это код, содержащийся в файлах из каталога "lcl", прочий код не подпадает под действие указанной лицензии.
659656
660657### Могу ли использовать в коммерческих приложениях дополнительные компоненты Lazarus?
661658
662659В составе Lazarus есть дополнительные компоненты, разработанные участниками сообщества. Некоторые из этих компонентов распространяются под лицензиями, отличными от лицензии самого Lazarus. Если вы используете такие компоненты, вы должны уточнить их лицензию. Обычно необходимое пояснение приводится в исходном коде файлов соответствующего пакета. Большинство дополнительных компонентов от сторонних разработчиков можно найти в подкаталоге "components" основного каталога Lazarus.
663660
664661### Как я могу узнать, что компонент является частью LCL?
665662
666663Все модули LCL размещаются в подкаталоге "lcl". Также доступен [список модулей](http://lazarus-ccr.sourceforge.net/docs/lcl/), входящих в LCL. Если в вашем коде вызываются модули, которых нет в этом списке, вероятно, вы используете компонент, не являющийся частью LCL.
667664
668665### Могу ли я создавать коммерческие плагины для Lazarus?
669666
670667Да, 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.
671668
672669---
673670*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