Difference between revisions of "Lazarus Faq/ru"

From Free Pascal wiki
Jump to navigationJump to search
m (Fixed syntax highlighting; deleted category included in page template)
 
(27 intermediate revisions by 13 users not shown)
Line 1: Line 1:
 
{{Lazarus Faq}}
 
{{Lazarus Faq}}
 
+
{{Note|Этот FAQ может быть '''устаревшим''' в некоторых частях.}}
== Главное ==
+
== Общее ==
  
 
===Почему получаемые бинарные файлы очень большие?===
 
===Почему получаемые бинарные файлы очень большие?===
Line 76: Line 76:
 
   # это комментарии
 
   # это комментарии
 
   # пути для других модулей и компонентов  
 
   # пути для других модулей и компонентов  
   -Fu{Пусть_к_лазарусу}/lcl/units/{целевая_система}
+
   -Fu{Путь_к_лазарусу}/lcl/units/{целевая_система}
   -Fu{Пусть_к_лазарусу}/components/units/{целевая_система}
+
   -Fu{Путь_к_лазарусу}/components/units/{целевая_система}
  
 
:Где {целевая_система} это системный префикс, указывающий для какой системы располагаются модули. Обычно этот префикс представляет собой пару имён "Процессор-ОСь", например i386-win32, i386-linux, i386-darwin.:
 
:Где {целевая_система} это системный префикс, указывающий для какой системы располагаются модули. Обычно этот префикс представляет собой пару имён "Процессор-ОСь", например i386-win32, i386-linux, i386-darwin.:
Line 129: Line 129:
  
 
Пожалуйста, помните, что не все свойства объектов, описанные в dfm-файлах, поддерживаются Lazarus, и часть из них может вызвать падения IDE.
 
Пожалуйста, помните, что не все свойства объектов, описанные в dfm-файлах, поддерживаются Lazarus, и часть из них может вызвать падения IDE.
 +
 +
Примечание: Вы не получите этой ошибки, начиная с версии Lazarus 0.9.29 (SVN) при использовании FreePascal 2.4.0 и выше. Компилятор этой версии умеет включать такие ресурсы в исполняемый файл на всех платформах. Тем не менее, проблема несовместимости отдельных свойств от этого не исчезает.
  
 
==== Ошибка: 'Identifier not found LazarusResources'. ====
 
==== Ошибка: 'Identifier not found LazarusResources'. ====
Line 134: Line 136:
 
При создании формы Lazarus автоматически добавляет некоторые необходимые модули в секцию uses вашего модуля, содержащего форму. После конвертации из Delphi в модуле могут отсутствовать необходимые ссылки. В данном конкретном случае вам необходимо добавить в секцию uses модуль LResources.
 
При создании формы Lazarus автоматически добавляет некоторые необходимые модули в секцию uses вашего модуля, содержащего форму. После конвертации из Delphi в модуле могут отсутствовать необходимые ссылки. В данном конкретном случае вам необходимо добавить в секцию uses модуль LResources.
  
=== При обращении к событиям объектов, например OnClick боъекта button, я получаю следующую ошибку: ERROR unit not found: stdCtrls===
+
=== При обращении к событиям объектов, например OnClick объекта button, я получаю следующую ошибку: ERROR unit not found: stdCtrls===
Убедитесь (Project -> Project Inspector),что ваш проект зависит от пакета 'LCL' и  что вы устновили исходники FPC.
+
Убедитесь (Project -> Project Inspector),что ваш проект зависит от пакета 'LCL' и  что вы установили исходники FPC.
  
 
Lazarus - это IDE (среда разработки) и библиотека визуальных компонентов LCL.
 
Lazarus - это IDE (среда разработки) и библиотека визуальных компонентов LCL.
Line 145: Line 147:
 
(Окружение -> Параметры -> Файлы -> Каталог исходного кода FPC).
 
(Окружение -> Параметры -> Файлы -> Каталог исходного кода FPC).
  
===How to embed a small file in the executable, without the need of a separate file? How to embed a resource?===
+
===Как внедрять содержимое небольшого файла в исполняемый файл? Как внедрять ресурсы?===
  
For example:
+
Например,
 
  /your/lazarus/path/tools/lazres sound.lrs sound1.wav sound2.wav ...
 
  /your/lazarus/path/tools/lazres sound.lrs sound1.wav sound2.wav ...
will create sound.lrs from sound1.wav and sound2.wav.
+
создаст sound.lrs из sound1.wav и sound2.wav.
  
Then include it *behind* the form lrs file:
+
Потом включите его *после* lrs-файла формы:
  
 
  ...
 
  ...
Line 159: Line 161:
 
   
 
   
 
  end.
 
  end.
In your program you can then use:
+
В Вашей программе эти ресурсы можно использовать следующим образом:
 
  Sound1AsString:=LazarusResources.Find('sound1').Value;
 
  Sound1AsString:=LazarusResources.Find('sound1').Value;
  
=== What is the meaning of the various file extensions used by Lazarus? ===
+
=== Что означают различные расширения файлов, используемые Lazarus? ===
  
The [[Lazarus Tutorial#The Lazarus files]] explains some extensions by an example.
+
Глава [[Lazarus Tutorial#The Lazarus files]] разъясняет назначение некторых расширений. Вот их краткий список:
Here is a brief list:
 
  
; <code>*.lpi</code> : Lazarus Project Information file (stored in XML; contains project-specific settings)
+
; <code>*.lpi</code> : файл с информацией о проекте Lazarus (в формате XML; содержит настройки, относящиеся к конкретному проекту)
; <code>*.lpr</code> : Lazarus Program file; contains Pascal source of main program
+
; <code>*.lpr</code> : программный файл Lazarus; содержит основной Pascal-код программы
; <code>*.lfm</code> : Lazarus Form file; contains configuration information for all objects on a form (stored in a Lazarus-specific textual format; the actions are described by Pascal source code in a corresponding <code>*.pas</code> file)
+
; <code>*.lfm</code> : файл формы Lazarus; содержит информацию обо всех объектах, размещённых на форме (хранится в специальном текстовом формате; связанные с объектами формы действия хранятся в одноимённом <code>*.pas</code>-файле)
; <code>*.pas</code> or <code>*.pp</code> : Unit with Pascal code (typically for a form stored in a corresponding <code>*.lfm</code> file)
+
; <code>*.pas</code> или <code>*.pp</code> : модуль с Pascal-кодом (обычно связан с формой в одноимённом <code>*.lfm</code>-файле)
; <code>*.lrs</code> : Lazarus Resource file (this is a generated file; not to be confused with a Windows resource file).  
+
; <code>*.lrs</code> : файл ресурсов Lazarus (это генерируемый файл; не является файлом ресурсом Windows).  
: This file can be created with lazres tool (in directory Lazarus/Tools) using commandline: lazres myfile.lrs myfile.lfm
+
: Этот файл может быть создан с помощью утилиты lazres (в каталоге Lazarus/Tools) путё вызова из командной строки: lazres myfile.lrs myfile.lfm
; <code>*.ppu</code> : Compiled unit
+
; <code>*.ppu</code> : скомпилированный модуль
; <code>*.lpk</code> : Lazarus package information file. (stored in XML; contains package-specific settings)
+
; <code>*.lpk</code> : информационный файл для пакета Lazarus (в формате XML; содержит настройки, относящиеся к конкретному пакету)
  
 
+
=== Когда я пишу ''var mytext: text;'', чтобы объявить текстовый файл, я получаю ошибку "Unit1.pas(32,15) Error: Error in type definition". Как можно это исправить?===
 
 
=== Когд я пишу ''var mytext: text;'', чтобы объявить текстовый файл, я получаю ошибку "Unit1.pas(32,15) Error: Error in type definition". Как можно это исправить?===
 
 
Класс TControl содержит свойство [[doc:lcl/controls/tcontrol.text.html|Text]]. В методе формы используется тип[[doc:rtl/system/text.html|Text]] из модуля system. Вы можете использовать тип [[doc:rtl/system/text.html|TextFile]], который всего лишь является другим названием типа Text, или можете добавить модуль при объявлении (см. в примере):
 
Класс TControl содержит свойство [[doc:lcl/controls/tcontrol.text.html|Text]]. В методе формы используется тип[[doc:rtl/system/text.html|Text]] из модуля system. Вы можете использовать тип [[doc:rtl/system/text.html|TextFile]], который всего лишь является другим названием типа Text, или можете добавить модуль при объявлении (см. в примере):
 
   var
 
   var
Line 201: Line 200:
 
Данное решение также применимо, если Вы получаете исключения при использовании Printer.Printers
 
Данное решение также применимо, если Вы получаете исключения при использовании Printer.Printers
  
=== Why are TForm.ClientWidth/ClientHeight the same as TForm.Width/Height ===
+
=== Почему TForm.ClientWidth/ClientHeight - это то же самое, что и TForm.Width/Height? ===
 
 
The TForm.Width/Height do no include the frame, because there was no way to retrieve the frame size on all platforms. Without a reliable way, the LCL would move the forms around on the screen or resize them endlessly.
 
 
 
Eventually when there is a reliable way to get the size and position of a window with its frame on all platforms, then it will be changed. To keep compatibility with older LCL forms, a version number and some extra methods will be added.
 
  
 +
TForm.Width/Height не включают границ окна, поскольку не существует способа получить размер этих границ на всех платформах. Без надёжного способа LCL будет перемещать формы по всему экрану или бесконечно изменять их размер.
  
 +
В конечном итоге, когда появится надёжный способ получения размера и позиции окна вместе с его границами для всех платформ, это будет изменено. Для сохранения совместимости со старыми LCL-формами, будет введён номер версии и использованы некоторые другие дополнительные методы.
  
 
== Отладка ==
 
== Отладка ==
  
=== How can I see debug output? ===
+
=== Как увидеть отладочные сообщения? ===
  
The LCL has in the LCLProc unit two procedures to write debug output. They are named:  
+
В модуле LCLProc в LCL есть две процедуры для вывода отладочных сообщений. Они называются:  
* '''DebugLn:''' which works about the same as WriteLn, but accepts only strings.
+
* '''DebugLn:''' которая работает также, как WriteLn, но принимает только строки.
* '''DbgOut:''' which works about the same as Write, but accepts only strings.
+
* '''DbgOut:''' которая работает также, как Write, но принимает только строки.
  
In normal circumstances the output is written to stdout. If stdout is closed, (for example when the application is {$AppType Gui} or compiled with -WG on Windows), no output is written.
+
В обычных условиях сообщения выводятся в stdout. Если stdout закрыт (например когда приложение {$AppType Gui} или откомпилировано с ключом -WG под Windows), сообщения не выводятся никуда.
  
Debug output can also be written to file. The initialization code of the LCLProc unit checks Lazarus.exe's command line parameters for '--debug-log=<file>'. On finding this parameter any subsequent debug output is sent to <file>.
+
Отладочные сообщение могут также выводится в файл. Код инициализации модуля LCLProc проверяет командую строку Lazarus.exe's на предмет наличия ключа '--debug-log=<file>'. Если этот ключ присутствует - весь последующий отладочный вывод направляется в <file>.
  
If no '--debug-log' command line parameter has been given, it next checks if an operating system environment variable xxx_debuglog exists, where xxx is the program file name without extension. For Lazarus this would be lazarus_debuglog. If such an environment variable exists, it uses the file specified in the lazarus_debuglog environment variable as file to receive debug output. Example: if you do:
+
Если этого ключа нет, проверяется существование системной переменной окружения xxx_debuglog, где xxx - имя файла программы без расширения. Для Lazarus это будет lazarus_debuglog. Если такая переменная окружения существует, файл указанный в ней будет использован для вывода отладочных сообщений.
 +
Пример: если вы сделаете:
 
  set lazarus_debuglog=c:\lazarus\debug.txt
 
  set lazarus_debuglog=c:\lazarus\debug.txt
debug output will be written to c:\lazarus\debug.txt.
+
то отладочные сообщения будут выводится в c:\lazarus\debug.txt.
  
Since this is implemented in lclproc, every application using lclproc, can use this output facility.
+
Так как это реализовано в lclproc, любое приложение использующее lclproc может использовать этот механизм вывода отладочных сообщений.
  
;Debuging Lazarus : Most useful for Windows: If you want output on a console, add {$APPTYPE console} to lazarus.pp ; Then rebuild Lazarus.
+
;Отладка Lazarus: Наиболее полезно для Windows: Если вы хотите выводить сообщения в консоль, добавьте {$APPTYPE console} в lazarus.pp ; После чего перекомпилируйте Lazarus.
  
 
=== Как мне просмотреть значение свойств? ===
 
=== Как мне просмотреть значение свойств? ===
Line 252: Line 250:
 
смотри здесь [[GDB Debugger Tips]]
 
смотри здесь [[GDB Debugger Tips]]
  
=== How can I debug FCL components from packages with Lazarus ===
+
=== Как я могу проводить отладку компонентов и пакетов FCL с помощью Lazarus ===
  
FCL components and classes are built without debug information by default and as a result, gdb cannot access component methods or properties. To build package components they must be rebuilt with a debug-line information "-gl" switch.  
+
Компоненты и классы FCL скомпилированны по умолчанию без отладночной информации. Как результат - gdb не моэет получить доступ к методам и свойствам этих объектов. Для пересборки компонентов FCL необходимо включить ключ компилятора "-gl" для генерации отладочной информации.
  
This example assumes you have a Linux distribution with /usr/local/ installation prefix and that the Database package fcl-db is what is needed to contain debug-line information. While the fcl-db is used in this example, you may issue this make command from ANY of the included packages.
+
Этот пример предпологает, что у вас Linux дистрибутив с установленным FPC в папке /usr/local/ и вам необходимо включить отладочную информацию для пакета fcl-db. По аналогии с пакетом fcl-db, используемом в данном примере, вы можете применить эти команды для ЛЮБЫХ пакетов, содержащихся в дистрибутиве.
  
Before you begin, you need to locate your FPC path by examining your FPC configuration file. The file (fpc.cfg) is located at /etc/fpc.cfg. Display the contents of fpc.cfg and find your fpc installation path. Look for a line starting with -Fu in the fpc.cfg:
+
В начале, вам необходимо найти путь к установленному FPC проверив ваш конфигурационный файл FPC. Это файл (fpc.cfg) расположен /etc/fpc.cfg. Просмотрите содержимое fpc.cfg определить папку установки. Обратите внимание на строки, начинающиеся с -Fu в fpc.cfg:
  
 
  -Fu/usr/local/lib/fpc/$fpcversion/units/$fpctarget/*
 
  -Fu/usr/local/lib/fpc/$fpcversion/units/$fpctarget/*
  
Make scripts are installing units into INSTALL_PATH/lib/fpc/$fpcversion/units/$fpctarget/,
+
При создании скрипта для установки модулей в папку INSTALL_PATH/lib/fpc/$fpcversion/units/$fpctarget/, вы должны быть уверены, что /usr/local это путь установки FPC, и он должен быть присвоем INSTALL_PREFIX, в противном случае Make-скрипт установи модули в неправильную папку или вообще завершится с ошибкой.
so you must be sure that /usr/local is the installation path, and should be assigned to INSTALL_PREFIX, otherwise the Make scripts will place units where they don't belong or the Make script will fail.
 
  
'''Step 1''': Open a shell terminal<br>
+
'''Step 1''': Открыть терминал и набрать терминале<br>
 
'''Step 2''': cd /user/local/share/src/fpc-2.3.1/fpc/fcl-db/<br>
 
'''Step 2''': cd /user/local/share/src/fpc-2.3.1/fpc/fcl-db/<br>
 
'''Step 3''': sudo make clean all install INSTALL_PREFIX=/usr/local OPT=-gl<br>
 
'''Step 3''': sudo make clean all install INSTALL_PREFIX=/usr/local OPT=-gl<br>
 
    
 
    
Note: INSTALL_PREFIX parameter should  be properly configured for units to be installed.
+
Замечание: Параметр INSTALL_PREFIX правильно указан для установки модулей.
In the sample below /usr/local is a default fpc path for Linux, but may vary on other OSes.
+
В примере ниже /usr/local - это путь по умолчанию для fpc в Linux, но он может сильно отличаться в других операционных системах
  
 
  make clean all install INSTALL_PREFIX=/usr/local OPT=-gl
 
  make clean all install INSTALL_PREFIX=/usr/local OPT=-gl
  
Finally, after rebuilding any FCL units you may want to rebuild LCL as well.
+
В конце, после пересборки любого FCL пакета, вам возможно необходимо будет пересобрать LCL.
  
 
== Contributing / Making Changes to Lazarus ==
 
== Contributing / Making Changes to Lazarus ==
  
=== I created a Patch to dock the IDE Messages form on the "Source Code Editor" form (at bottom) ===
+
=== Я создал патч для пристыковки  окна сообщений IDE к окну "Редактор исходного кода" (снизу) ===
  
Such patches will not be applied, because they only implement a small part of the needed docking. The goal is to create a complete dock manager and use that. A complete dock manager can dock all IDE windows and it allows to let the user define how to dock. For example dock the messages window above or below the source editor or ... or not at all. For instance:
+
Такие патчи не будут приняты, так как они реализуют лишь малую часть требуемой функциональности стыковки (docking). Цель состоит в создании полноценного менеджера стыковки и его использовании. Полноценный менеджер стыковки(dock manager) может соединять все окна и позволяет пользователю определять, как их стыковать (должно ли окно сообщений быть над или под окном кода ... или вообще быть отделено от него).
 +
К примеру:
  
 
<pre>
 
<pre>
Line 296: Line 294:
 
</pre>
 
</pre>
  
The dock manager can store the layout and restore it on next load. Preferably the dock manager can dock in pages too. The dock manager does not need to use drag and drop.
+
Менеджер стыковки может сохранить это расположение и восстановить его при следующем старте. Предпочтительно, если менеджер может работать не только с окнами, но и со страницами редактора кода. Менеджер стыковки не требует использования drag&drop.
All patches implementing docking without a dock manager makes it harder to implement a real dock manager and will be rejected.
+
Все патчи реализующие стыковку без менеджера стыковки усложняют реализацию настоящего менеджера стыковки и потому будут отклонены.
  
As a temporary solution you can use this IDE extension: [[Manual Docker]]
+
В качестве временного решения можно использовать это расширение IDE: [[Manual Docker]]
  
 
=== Я исправил/улучшил Lazarus. Как добавить мои изменения в официальный код Lazarus? ===
 
=== Я исправил/улучшил Lazarus. Как добавить мои изменения в официальный код Lazarus? ===
Line 325: Line 323:
 
== Linux ==
 
== Linux ==
  
=== How can I debug on Linux without the IDE? ===
+
=== Как выполнить отладку в Linux без IDE? ===
  
First of all you need a debugger. gdb is the standard debugger under linux and
+
Прежде всего потребуется отладчик. gdb это стандартный отладчик под линукс, имеющий
there are several GUI-frontends available. One common frontend is ddd, which is
+
несколько GUI-интерфейсов. Наиболее распространённый интерфейс - ddd - является частью большинства
part of most common distributions. To compile lazarus/lcl with debug-information
+
популярных дистрибутивов. Для компиляции lazarus/lcl с информацией для отладчика вам нужно
you should then use the following commands to start a debug session:
+
использовать следующие команды для запуска отладочной сессии:
  
 
   $ make clean; make OPT=-dDEBUG
 
   $ make clean; make OPT=-dDEBUG
 
   $ ddd lazarus
 
   $ ddd lazarus
  
Be warned however, that ddd is not as comfortable as e.g. the Lazarus debugger.
+
Однако, следует отметить что ddd не такой удобный как например отладчик Lazarus.  
Specially if it comes to view the contents of a variable you have to take into
+
Особенно если он используется для просмотра значений имеющихся переменных, учитывая что
account that ddd/gdb are case sensitive whereas Pascal is case-insensitive.
+
ddd/gdb регистрозависимы, а Pascal - регистронезависим. Поэтому, чтобы видеть значения переменных,
Therefore you have to type all variable names in uppercase to see their
+
необходимо набирать их имена в верхнем регистре. Для получения более подробной информации
contents. For more information take a look into the fpc-manuals.
+
обратитесь к fpc-manuals.
  
 
=== I can debug now but ddd does not find my sources or complains that they contain no code. Whats that? ===
 
=== I can debug now but ddd does not find my sources or complains that they contain no code. Whats that? ===
Line 460: Line 458:
 
Environment->General Options->Files->Lazarus Directory Top
 
Environment->General Options->Files->Lazarus Directory Top
  
===Lazarus комплируется, но компоновка прерывается с ошибкой: libgdk-pixbuf not found===
+
===Lazarus компилируется, но компоновка прерывается с ошибкой: libgdk-pixbuf not found===
Для решение проблемы нужно установить библиотеку gdk-pixbuf library для gtk1.x:
+
Для решения проблемы нужно установить библиотеку gdk-pixbuf library для gtk1.x:
  
 
Библиотека gdk-pixbuf может быть найдена:
 
Библиотека gdk-pixbuf может быть найдена:
Line 481: Line 479:
 
  apt-get install libgtk2.0-dev
 
  apt-get install libgtk2.0-dev
  
===Я исползую SuSE, при компиляции получаю ошибку: "/usr/bin/ld: cannot find -lgtk Error: Error while linking"===
+
===Я использую SuSE, при компиляции получаю ошибку: "/usr/bin/ld: cannot find -lgtk Error: Error while linking"===
 
Ранние версии SuSE (до SuSE 11) устанавливали gtk библиотеки devel в директорию /opt/gnome/lib (или /opt/gnome/lib64 для 64-й версии), что не является общепринятым путём для библиотек.  
 
Ранние версии SuSE (до SuSE 11) устанавливали gtk библиотеки devel в директорию /opt/gnome/lib (или /opt/gnome/lib64 для 64-й версии), что не является общепринятым путём для библиотек.  
  
Line 515: Line 513:
 
'''Решение''': Добавьте модуль cthreads в секцию uses главного модуля вашей программы (обычно это .lpr-файл).
 
'''Решение''': Добавьте модуль cthreads в секцию uses главного модуля вашей программы (обычно это .lpr-файл).
  
===I have Ubuntu Breezy/Mandriva KDE3 and my fonts in Lazarus IDE look too big===
+
===У меня Ubuntu Breezy/Mandriva KDE3 и шрифты в Lazarus IDE выглядят слишком большими===
If Lazarus is compiled with Gtk1.2, the settings in Gnome Preferences/Font don't have any effect as
+
Попробуйте следующее:
they are related to Gtk2.
+
Создайте файл с именем «.gtkrc.mine» в домашней директории (если он не существует) и внесите в него данный текст:
You could try this solution:
 
Create a file named .gtkrc.mine in your home directory (if it's not already there) and add
 
these lines to it:
 
  
 
<pre>
 
<pre>
Line 531: Line 526:
 
</pre>
 
</pre>
  
If this is not enough try and create also a .gtkrc symlink to .gtkrc.mine . It worked in this way under Xubuntu 7.10, Mandriva 2009.0 KDE3.
+
Если это не сработает, попробуйте создать ссылку .gtkrc на .gtkrc.mine. Данный способ был опробован в Xubuntu 7.10 и Mandriva 2009.0 KDE3
 +
 
 +
'''Примечание:''' Если Lazarus был скомпилирован с использованием библиотеки Gtk1.2, то настройка шрифтов в Gtk2 не будет влиять на отображение текста в нём.
 +
 
 +
===Как подключать и использовать сторонние файлы ресурсов (*.rc) в GTK приложении?===
 +
 
 +
Вариант 1.
 +
Переименуйте файл ресурсов (rc) ''мой_ресурс.rc'' в ''имя_программы.gtkrc'' и поместите в папку с исполняемым файлом программы.
  
===How can my gtk programs use custom rc files?===
+
Вариант 2.
 +
Подключите модуль ''GtkInt'' в секцию ''uses'' исходного кода проекта (*.lpr), и допишите код
 +
<syntaxhighlight lang=pascal>
 +
{$IFDEF LCLGtk}
 +
  GTKWidgetSet.SetRCFilename('имя_вашего_файла_ресурса');
 +
{$ENDIF LCLGtk}
 +
</syntaxhighlight>
  
Option a)
+
перед вызовом ''Application.Initialize''.
Name the rc file ''yourprogram.gtkrc'' and put it in the same directory where the executable is.
 
  
Option b)
+
Вариант 3. Используя модуль ''gtk2'' вызовите метод ''gtk_rc_parse('имя_файла_ресурса')'' а также ''gtk_rc_reparse_all''.
Use unit ''GtkInt'' and call ''GTKWidgetSet.SetRCFilename('your_preferred_rc_file');''
 
Best done before ''Application.Initialize'' in the .lpr file with ''{$IFDEF LCLGtk}''.
 
  
 
===I have Ubuntu and I cannot compile for Gtk2 due to missing libraries===
 
===I have Ubuntu and I cannot compile for Gtk2 due to missing libraries===
Line 622: Line 627:
 
*and Linking > Link Style > Link smart (-XX)
 
*and Linking > Link Style > Link smart (-XX)
  
== Licensing ==
+
== Лицензирование ==
  
 
=== Могу ли я создавать коммерческие приложения, используя Lazarus? ===
 
=== Могу ли я создавать коммерческие приложения, используя Lazarus? ===
Line 629: Line 634:
 
Отметим, что LCL - это код, содержащийся в файлах из каталога "lcl", прочий код не подпадает под действие указанной лицензии.
 
Отметим, что LCL - это код, содержащийся в файлах из каталога "lcl", прочий код не подпадает под действие указанной лицензии.
  
=== Why are some components restricted from usage in commercial application ? ===
+
=== Могу ли использовать в коммерческих приложениях дополнительные компоненты Lazarus? ===
  
Lazarus comes with additional components, that were developed by third parties. Those are under various other Licenses. If you wish to use them you need to see the License within the source files of those packages.
+
В составе Lazarus есть дополнительные компоненты, разработанные участниками сообщества. Некоторые из этих компонентов распространяются под лицензиями, отличными от лицензии самого Lazarus. Если вы используете такие компоненты, вы должны уточнить их лицензию. Обычно необходимое пояснение приводится в исходном коде файлов соответствующего пакета.
Most of those 3rd party components are in the directory "components".
+
Большинство дополнительных компонентов от сторонних разработчиков можно найти в подкаталоге "components" основного каталога Lazarus.
  
=== How do I know if a Component is part of the LCL ? ===
+
=== Как я могу узнать, что компонент является частью LCL? ===
  
All LCL units are in the directory "lcl". A List of units belonging to the LCL can be found here http://lazarus-ccr.sourceforge.net/docs/lcl/ . If you code uses units not listed on this page, you may have used a component that is not part of the LCL.
+
Все модули LCL размещаются в подкаталоге "lcl". Также доступен [http://lazarus-ccr.sourceforge.net/docs/lcl/ список модулей], входящих в LCL. Если в вашем коде вызываются модули, которых нет в этом списке, вероятно, вы используете компонент, не являющийся частью LCL.
  
=== Can I make commercial plug-ins for Lazarus ? ===
+
=== Могу ли я создавать коммерческие плагины для Lazarus? ===
  
Yes, 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.
+
Да, 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.

Latest revision as of 23:51, 18 February 2020

العربية (ar) Deutsch (de) English (en) español (es) français (fr) magyar (hu) italiano (it) 日本語 (ja) 한국어 (ko) português (pt) русский (ru) slovenčina (sk) 中文(中国大陆)‎ (zh_CN) 中文(台灣)‎ (zh_TW)

Light bulb  Примечание: Этот FAQ может быть устаревшим в некоторых частях.

Общее

Почему получаемые бинарные файлы очень большие?

Бинарные файлы очень большие из-за того, что включают в себя много отладочной информации для использования в отладчик gdb (GNU Debugger). Компилятор имеет настройку для удаления отладочной информации из исполняемого файла (-Xs), но из-за ошибки в компиляторе (версия 2.0.2 и ниже) она не работает корректно. Ошибка исправлена в версиях компилятора 2.0.4 и выше.

Вы можете использовать программу "strip" для удаления отладочной информации из исполняемых файлов. Она находится в каталоге Lazarus'а: lazarus\pp\bin\i386-win32\.

Наберите "strip --strip-all <путь к исполняемому файлу>" в командной строке.

Если Вы хотите сделать Вашу программу очень маленькой, то Вы можете попробовать использовать UPX. UPX - это очень хороший exe-упаковщик. It includes no memory overhead due to in-place decompression. И также имеет очень быструю распаковку (~10 МБ/сек на Pentium 133).

Для использования upx наберите "upx <путь к исполняемому файлу>" в командной строке.

После использования strip и upx простая GUI программа на Lazarus'е получается:

  • ~ 700Кб на Linux
  • ~ 420Кб на Windows

Для более детальной информации о недостатках использования UPX обратитесь к статье Размер имеет значение. Также нужно отметить, что "hello world" программы lazarus уже включают в себя множество возможностей, таких как:

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

Всё это делает приложение большим, но это так же и включает всё, что может потребоваться нетривиальному приложению.

Начальный размер исполняемого файла Lazarus велик, однако растёт в дальнейшем довольно медленно. Проект на С++ (это для примера, но относится и к другим языкам / инструментальные средства тоже), сначала очень маленький (типа "Hello world"), но быстро растет по экспоненте, когда Вы добавляете дополнительные возможности, чтобы написать нетривиальное приложение.


Lazarus vs cpp.png


Краткое руководство по уменьшению размера Lazarus/FPC приложения (проверено в Lazarus 0.9.26)

  • 1. Project|Compiler Options|Code|Smart Linkable (-CX) -> Поставить галочку
  • 2. Project|Compiler Options|Linking|Debugging|Display Line Numbers in Run-time ErrorBacktraces (-gl) -> Убрать галочку
  • 3. Project|Compiler Options|Linking|Debugging|Strip Symbols From Executable (-Xs) -> Поставить галочку
  • 4. Project|Compiler Options|Linking|Link Style|Link Smart (-XX) -> Поставить галочку

Самые важные элементы, мне кажется, 2 и 3. Для простого приложения выполнимый размер должен теперь составить 1-3 Мбайта вместо 15-20 Мбайт. В этом пункте Вы можете также попробовать: Project|Compiler Options|Code|Optimizations|smaller, вместо Faster -> Поставить галочку (Предупреждение: это может уменьшить производительность),

  • 5. (Опционально) Запустите UPX <путь к исполняемому файлу> для сжатия вашего бинарника дополнительно в 2-3 раза (Предупреждение: как сказано выше, есть недостатки в использовании UPX).

УСТАРЕЛО: Почему компоновка такая медленная в Windows?

Эта проблема свойственна лишь старым версиям: FPC 2.2 и Lazarus 0.9.24. Пожалуйста обновите Лазарус. Всё написанное здесь относится только к старым версиям.

В общем, компоновка на Windows занимает больше времени, чем на других платформах, потому что GNU компоновщик под эту операционную систему очень медленный. FPC (2.2) использует этот компоновщик при сборке программ. Эта проблема возникает только на Windows и только на слабых компьютерах (с процессором частотой менее 1ГГц и/или оперативной памятью меньше 128 Мегабайт)

Также, если вы используете умную компоновку (smartlinking), общее время компиляции так же увеличиться. Подробнее об этом можно прочитать здесь: File size and smartlinking

Для решения этой проблемы, был разработан внутренний компоновщик. Он есть во всех версиях FPC, начиная с 2.2. Его использование позволило в значительной степени сократить общее время компиляции. Внутренний компоновщик используется только при компиляции для Windows системы.

Мне нужен ppc386.cfg или fpc.cfg?

Вам нужен только fpc.cfg. В нем указаны пути, по которым компилятор будет искать библиотеки.

Как я могу скомпилировать lazarus?

Нет ничего проще :)

$ cd lazarus
$ make clean all

Как собирать LCL проекты без Lazarus-а?

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

Эта утилита используется для сборки проектов и lazarus-пакетов (packages).

  • Если вам нужно собрать LCL приложение без среды разработки и не используя lazbuild, вам необходимо добавить следующие строки в файл fpc.cfg
  # строчки начинающиеся с # можно не добавлять
  # это комментарии
  # пути для других модулей и компонентов 
 -Fu{Путь_к_лазарусу}/lcl/units/{целевая_система}
 -Fu{Путь_к_лазарусу}/components/units/{целевая_система}
Где {целевая_система} это системный префикс, указывающий для какой системы располагаются модули. Обычно этот префикс представляет собой пару имён "Процессор-ОСь", например i386-win32, i386-linux, i386-darwin.:

После добавления этих строк в конфигурационный файл, вызовете команду: fpc myproject.lpr myproject.lpr это имя основного файла проекта (модуль начинающийся с "program" или "library"). Но имя может быть другим, т.к. Лазарус не принуждает Вас использовать расширение .lpr.

Кроме того, если Ваш проект использует какие-либо особые настройки, вы можете получить командную строку для компиляции, используя меню в Лазарусе: Проект->Параметры проекта...->Показать параметры (параметров может быть очень много, удобно скопировать их в отдельный скрипт файл .bat или .sh);

Какая версия FPC требуется?

Версия 2.4.0 для всех операционных систем.

Я не могу скомпилировать Lazarus

  1. Проверьте версию компилятора
  2. Проверьте версию (fpc)библиотек, они должны быть той же версии
  3. Проверьте путь установки компилятора на наличие в нем пробелов. Пробелов в нем не должно быть!
  4. Проверьте наличие файла fpc.cfg, а не старого файла ppc386.cfg
  5. Проверьте также OS-dependent FAQs

При компиляции проекта возникает ошибка:

"Cannot find Unit interfaces". Как можно это исправить?

Ошибка возникает потомучто компилятор не может найти 'interfaces.ppu' или он найден, но он поврежден, неправильной версии или просрочен.

Этот модуль может находиться в {LazarusDir}\lcl\units\{TargetCPU}-{TargetOS}\{LCLWidgetSet}\interfaces.ppu. Например: /home/username/lazarus/lcl/units/i386-linux/gtk/interfaces.ppu.

Убедитесь, что он только здесь. Если находятся несколько версий interfaces.ppu, то вы возможно получите неверную конфигурацию (к примеру добавлен каталог lcl в список путей поиска). Удалите все interfaces.ppu, оставьте только тот что в каталоге указаном выше.

Если вы выберете другой widgetset, то при пересборке lazarus, понадобится пересобрать LCL для этого widgetset.

Если ошибка возникает несмотря на то что 'interfaces.ppu' на месте - значит используется, иная compiler/rtl для компиляции проекта нежели для компиляции Lazarus IDE. Можно сделать одно из следующего:

  • Пересобрать LCL (или полностью Lazarus) с компилятором выбраным в Environmnent Options. Для этого можно кликнуть Tools -> Build Lazarus. Перед этим проверьте текущие настройки в Tools -> Configure Build Lazarus.
  • Поменять компилятор в Environment Options на тот что используется для компиляции Lazarus. Посмотрите внимательно также в Environment Options что используются корректный путь к каталогу Лазаря (Lazarus Directory) и к исходникам FPC. Убедитесь что есть только только один файл конфигурации fpc.cfg - он должен располагаться /etc/ для Linux/Unix или вместе с компилятором fpc под Windows. Попробуйте запустить "fpc -vt bogus" для того чтобы увидеть какой fpc.cfg используется на вашей системе. Мешающие копии обычно появляются при обновлении компилятора; они могут находится в домашнем каталоге или вместе с пересобраным новым компилятором. УДАЛИТЕ ИХ!!
  • Можно также попробовать сменить текущий widgetset проекта. Например, примерный проект "objectinspector" поставляемый с Лазарем поумолчанию использует gtk. Компиляция этого проекта наверняка выдаст "Can't find unit interfaces" под Windows. Смена widgetset на default(Win32) в Project | Compiler Options... | LCL Widget Type (various) должно исправить это.

Когда я пытаюсь откомпилировать проект Delphi в lazarus, я получаю сообщение об ошибке

Ошибка на строке :{$R *.DFM}. Как мне решить эту проблему?

Lazarus (а точнее - Linux) не знает о таком понятии, как "ресурсы", и не может использовать некоторые связанные с ними понятия, пришедшие из Delphi/Win32. Однако, Lazarus использует методы, обеспечивающие совместимость с этими понятиями. Вы сможете использовать формы Delphi (файлы .dfm), если выполните следующие шаги:

  • Используйте текстовые версии .dfm-файлов. D5 и более поздние версии используют такие файлы по умолчанию. Если у вас более старые файлы, выполните следующее: нажмите ALT-F12 для просмотра кода формы в виде текста и скопируйте/вставьте текст. Если у вас есть текстовый .dfm-файл, просто скопируйте его содержание в .lfm-файл.
  • Создайте файл с помощью lazres (в меню lazarus/tools) следующей командой: lazres yourform.lrs yourform.lfm
  • Добавьте следующую строку в секцию initialization:
     initialization
     {$I yourform.lrs}

Пожалуйста, помните, что не все свойства объектов, описанные в dfm-файлах, поддерживаются Lazarus, и часть из них может вызвать падения IDE.

Примечание: Вы не получите этой ошибки, начиная с версии Lazarus 0.9.29 (SVN) при использовании FreePascal 2.4.0 и выше. Компилятор этой версии умеет включать такие ресурсы в исполняемый файл на всех платформах. Тем не менее, проблема несовместимости отдельных свойств от этого не исчезает.

Ошибка: 'Identifier not found LazarusResources'.

При создании формы Lazarus автоматически добавляет некоторые необходимые модули в секцию uses вашего модуля, содержащего форму. После конвертации из Delphi в модуле могут отсутствовать необходимые ссылки. В данном конкретном случае вам необходимо добавить в секцию uses модуль LResources.

При обращении к событиям объектов, например OnClick объекта button, я получаю следующую ошибку: ERROR unit not found: stdCtrls

Убедитесь (Project -> Project Inspector),что ваш проект зависит от пакета 'LCL' и что вы установили исходники FPC.

Lazarus - это IDE (среда разработки) и библиотека визуальных компонентов LCL. Все другие вещи, как IO, Database, FCL и RTL предоставляются FPC. IDE нужны пути ко всем исходникам.

Пути к исходникам FPC могут быть установлены через: Environment -> Environment Options -> Files -> FPC source directory (Окружение -> Параметры -> Файлы -> Каталог исходного кода FPC).

Как внедрять содержимое небольшого файла в исполняемый файл? Как внедрять ресурсы?

Например,

/your/lazarus/path/tools/lazres sound.lrs sound1.wav sound2.wav ...

создаст sound.lrs из sound1.wav и sound2.wav.

Потом включите его *после* lrs-файла формы:

...
initialization
{$i unit1.lrs} // this is main resource file (first)
{$i sound.lrs} // user defined resource file

end.

В Вашей программе эти ресурсы можно использовать следующим образом:

Sound1AsString:=LazarusResources.Find('sound1').Value;

Что означают различные расширения файлов, используемые Lazarus?

Глава Lazarus Tutorial#The Lazarus files разъясняет назначение некторых расширений. Вот их краткий список:

*.lpi
файл с информацией о проекте Lazarus (в формате XML; содержит настройки, относящиеся к конкретному проекту)
*.lpr
программный файл Lazarus; содержит основной Pascal-код программы
*.lfm
файл формы Lazarus; содержит информацию обо всех объектах, размещённых на форме (хранится в специальном текстовом формате; связанные с объектами формы действия хранятся в одноимённом *.pas-файле)
*.pas или *.pp
модуль с Pascal-кодом (обычно связан с формой в одноимённом *.lfm-файле)
*.lrs
файл ресурсов Lazarus (это генерируемый файл; не является файлом ресурсом Windows).
Этот файл может быть создан с помощью утилиты lazres (в каталоге Lazarus/Tools) путё вызова из командной строки: lazres myfile.lrs myfile.lfm
*.ppu
скомпилированный модуль
*.lpk
информационный файл для пакета Lazarus (в формате XML; содержит настройки, относящиеся к конкретному пакету)

Когда я пишу var mytext: text;, чтобы объявить текстовый файл, я получаю ошибку "Unit1.pas(32,15) Error: Error in type definition". Как можно это исправить?

Класс TControl содержит свойство Text. В методе формы используется типText из модуля system. Вы можете использовать тип TextFile, который всего лишь является другим названием типа Text, или можете добавить модуль при объявлении (см. в примере):

  var
  MyTextFile: TextFile;
  MyText: System.Text;

Сходный конфликт имен существует и при связывании и закрытии текстового файла. TForm имеет методы assign и Close. Вместо них вы можете использовать AssignFile и CloseFile, или же добавлять имя модуля System (System.Close, System.Assign).

Я получаю ошибку при использовании Printer.BeginDoc

Модуль Printers должен быть добавлен в секцию uses.

Пакет Printer4Lazarus должен быть добавлен в зависимости Вашего проекта в IDE: Project|Project Inspector|Add|New Requirement|Package Name:

Если пакета Printer4Lazarus нет в списке пакетов, то Вам нобходимо установить его. Пакет является частью установки Lazarus и может быть найден по следующему пути: [каталог установки lazarus]\components\printers

Если Вы используете стандартный путь для установки Lazarus'а, то [каталог установки larazus] находится:

  • Windows: c:\lazarus
  • Linux: /usr/lib/lazarus

Данное решение также применимо, если Вы получаете исключения при использовании Printer.Printers

Почему TForm.ClientWidth/ClientHeight - это то же самое, что и TForm.Width/Height?

TForm.Width/Height не включают границ окна, поскольку не существует способа получить размер этих границ на всех платформах. Без надёжного способа LCL будет перемещать формы по всему экрану или бесконечно изменять их размер.

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

Отладка

Как увидеть отладочные сообщения?

В модуле LCLProc в LCL есть две процедуры для вывода отладочных сообщений. Они называются:

  • DebugLn: которая работает также, как WriteLn, но принимает только строки.
  • DbgOut: которая работает также, как Write, но принимает только строки.

В обычных условиях сообщения выводятся в stdout. Если stdout закрыт (например когда приложение {$AppType Gui} или откомпилировано с ключом -WG под Windows), сообщения не выводятся никуда.

Отладочные сообщение могут также выводится в файл. Код инициализации модуля LCLProc проверяет командую строку Lazarus.exe's на предмет наличия ключа '--debug-log=<file>'. Если этот ключ присутствует - весь последующий отладочный вывод направляется в <file>.

Если этого ключа нет, проверяется существование системной переменной окружения xxx_debuglog, где xxx - имя файла программы без расширения. Для Lazarus это будет lazarus_debuglog. Если такая переменная окружения существует, файл указанный в ней будет использован для вывода отладочных сообщений. Пример: если вы сделаете:

set lazarus_debuglog=c:\lazarus\debug.txt

то отладочные сообщения будут выводится в c:\lazarus\debug.txt.

Так как это реализовано в lclproc, любое приложение использующее lclproc может использовать этот механизм вывода отладочных сообщений.

Отладка Lazarus-а
Наиболее полезно для Windows: Если вы хотите выводить сообщения в консоль, добавьте {$APPTYPE console} в lazarus.pp ; После чего перекомпилируйте Lazarus.

Как мне просмотреть значение свойств?

Вам нужно использовать самую последнюю версию FPC из исходников (2.5.1) или релиз 2.4.0. Любая версия позднее указанных, так же подойдёт.

Если Вы скомпилируете приложение, использую ключ -gw (отладочная информация dwarf), Вы сможете просмотреть значения свойств.

Внимание: это возможно, только для тех свойст, которые напрямую связан с членом класса, директива "read" указывает на переменную, а не метод.

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

Проверка свойства по результату функции (как описана выше), ещё не реализована.

Почему отладчик не показывает некоторые переменные или структуры (выдавая ошибки "no such symbol"/"incomplete type")

Для решения проблем с: - свойствами
- динамическими массивами
- переменными во вложенных процедурах
- "no such symbol in context"
- "incomplete type"

смотри здесь GDB Debugger Tips

Как я могу проводить отладку компонентов и пакетов FCL с помощью Lazarus

Компоненты и классы FCL скомпилированны по умолчанию без отладночной информации. Как результат - gdb не моэет получить доступ к методам и свойствам этих объектов. Для пересборки компонентов FCL необходимо включить ключ компилятора "-gl" для генерации отладочной информации.

Этот пример предпологает, что у вас Linux дистрибутив с установленным FPC в папке /usr/local/ и вам необходимо включить отладочную информацию для пакета fcl-db. По аналогии с пакетом fcl-db, используемом в данном примере, вы можете применить эти команды для ЛЮБЫХ пакетов, содержащихся в дистрибутиве.

В начале, вам необходимо найти путь к установленному FPC проверив ваш конфигурационный файл FPC. Это файл (fpc.cfg) расположен /etc/fpc.cfg. Просмотрите содержимое fpc.cfg определить папку установки. Обратите внимание на строки, начинающиеся с -Fu в fpc.cfg:

-Fu/usr/local/lib/fpc/$fpcversion/units/$fpctarget/*

При создании скрипта для установки модулей в папку INSTALL_PATH/lib/fpc/$fpcversion/units/$fpctarget/, вы должны быть уверены, что /usr/local это путь установки FPC, и он должен быть присвоем INSTALL_PREFIX, в противном случае Make-скрипт установи модули в неправильную папку или вообще завершится с ошибкой.

Step 1: Открыть терминал и набрать терминале
Step 2: cd /user/local/share/src/fpc-2.3.1/fpc/fcl-db/
Step 3: sudo make clean all install INSTALL_PREFIX=/usr/local OPT=-gl

Замечание: Параметр INSTALL_PREFIX правильно указан для установки модулей. В примере ниже /usr/local - это путь по умолчанию для fpc в Linux, но он может сильно отличаться в других операционных системах

make clean all install INSTALL_PREFIX=/usr/local OPT=-gl

В конце, после пересборки любого FCL пакета, вам возможно необходимо будет пересобрать LCL.

Contributing / Making Changes to Lazarus

Я создал патч для пристыковки окна сообщений IDE к окну "Редактор исходного кода" (снизу)

Такие патчи не будут приняты, так как они реализуют лишь малую часть требуемой функциональности стыковки (docking). Цель состоит в создании полноценного менеджера стыковки и его использовании. Полноценный менеджер стыковки(dock manager) может соединять все окна и позволяет пользователю определять, как их стыковать (должно ли окно сообщений быть над или под окном кода ... или вообще быть отделено от него). К примеру:

+-------------------++--+
|menu               ||  |
+-------------------+|  |
+--++---------------+|  |
|PI|| Source Editor ||CE|
+--+|               ||  |
+--+|               ||  |
|  |+---------------++--+
|OI|+-------------------+
|  ||messages           |
+--++-------------------+

Менеджер стыковки может сохранить это расположение и восстановить его при следующем старте. Предпочтительно, если менеджер может работать не только с окнами, но и со страницами редактора кода. Менеджер стыковки не требует использования drag&drop. Все патчи реализующие стыковку без менеджера стыковки усложняют реализацию настоящего менеджера стыковки и потому будут отклонены.

В качестве временного решения можно использовать это расширение IDE: Manual Docker

Я исправил/улучшил Lazarus. Как добавить мои изменения в официальный код Lazarus?

Создайте патч и пришлите его разработчикам. Более подробную информацию смотрите здесь Creating A Patch/ru.

How can I become a Lazarus developer and access management in the SVN and bug-tracker?

First of all: you must learn about Lazarus, to prove your knowledge and skill. Start by reading the wiki articles, read the Lazarus source code, giving a look at the Lazarus Bug-Tracker, fix some bugs, and if you think you are ready, contact the developers on the mailing list.

Где объявлены ...

Константы виртуальных клавиш

Константы виртуальных клавиш (VK_UP, VK_ESCAPE и т.д ) объявлены в LCLType. Добавьте LCLtype в uses секцию.

Использование среды разработки

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

Чтобы вызвать окно завершения идентификатора нажмите [ctrl][space] (по умолчанию для Windows и Linux).

Вы можете настроить автоматическое появление этого окошка в пункте меню Окружение->Редактор->Code Tools->Автоматические функции

Linux

Как выполнить отладку в Linux без IDE?

Прежде всего потребуется отладчик. gdb это стандартный отладчик под линукс, имеющий несколько GUI-интерфейсов. Наиболее распространённый интерфейс - ddd - является частью большинства популярных дистрибутивов. Для компиляции lazarus/lcl с информацией для отладчика вам нужно использовать следующие команды для запуска отладочной сессии:

 $ make clean; make OPT=-dDEBUG
 $ ddd lazarus

Однако, следует отметить что ddd не такой удобный как например отладчик Lazarus. Особенно если он используется для просмотра значений имеющихся переменных, учитывая что ddd/gdb регистрозависимы, а Pascal - регистронезависим. Поэтому, чтобы видеть значения переменных, необходимо набирать их имена в верхнем регистре. Для получения более подробной информации обратитесь к fpc-manuals.

I can debug now but ddd does not find my sources or complains that they contain no code. Whats that?

This is a path-related problem with either gdb or ddd. You can avoid this by

  • 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.
  • In ddd goto [Edit] [gdb-settings] and set the search-path
  • Create a $(HOME)/.gdbinit file like:
     directory /your/path/to/lazarus
     directory /your/path/to/lazarus/lcl
     directory /your/path/to/lazarus/lcl/include

I receive an error during the linking that states /usr/bin/ld can't find -l<some lib>

Package Based Distributions
You 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).
Some distributions have commands to find which package contains a file:
Mandriva
[]$ urpmf lib<somelib>.so
will list all packages containing the file named lib<somelib>.so, you'll have to install those ending in -devel
Debian
install the apt-file utility (apt-get install apt-file) then
[]$ apt-file search lib<somelib>.so
will list all packages containing the file named lib<somelib>.so, you'll have to install those ending in -dev


Source Based Distributions and Manual Compilation (LFS)
Make 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).
FreeBSD
As 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:
[]# cd /usr/local/lib && ln -s libglib-12.so libglib12.so
[]# cd /usr/X11R6/lib && ln -s libgtk-12.so libgtk12.so
[]# cd /usr/X11R6/lib && ln -s libgdk-12.so libgdk12.so
NetBSD
As source based distro's, and also make sure you have -Fl/usr/pkg/lib in your fpc.cfg and/or Lazarus library path

How can I convert a kylix 2 project into a lazarus project?

Nearly the same way as converting a Kylix project into a Delphi/VCL project.

The 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:

  • Rename all used CLX Q-units like QForms, QControls, QGraphics, ... into their VCL counterparts: Forms, Controls, Graphics, ...
  • Add LResources to the uses section of every form source
  • Rename or copy all .xfm files to .lfm files.
  • Rename or copy .dpr file to .lpr file.
  • Add "Interfaces" to the uses section in the .lpr file.
  • Remove {$R *.res} directive
  • Remove {$R *.xfm} directive
  • Add {$mode objfpc}{$H+} or {$mode delphi}{$H+} directive to .pas and .lpr files
  • Add an initialization section to the end of each form source and add an include directive for the .lrs file (lazarus resource file):
 initialization
   {$I unit1.lrs}
The .lrs files can be created via the lazres tool in: (lazarusdir)/tools/lazres.
For example: ./lazres unit1.lrs unit1.lfm
  • Fix the differences. The LCL does not yet support every property of the VCL and the CLX is not fully VCL compatible.
  • 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)

When compiling lazarus the compiler can not find a unit. e.g.: gtkint.pp(17,16) Fatal: Can't find unit GLIB

1. Check a clean rebuild: do a 'make clean all'

2. Check if the compiler has the correct version (2.0.4 or higher)

3. 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.

Hint: You can see which config file is used with 'ppc386 -vt bogus'
Remove any ppc386.cfg as it is really obsolete.

4. Check if the config file (/etc/fpc.cfg) contains the right paths to your fpc libs. There must be three lines like this:

   -Fu/usr/lib/fpc/$fpcversion/units/$fpctarget
   -Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/rtl
   -Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/*
The first part of these paths (/usr/lib/fpc) depends on your system. On some systems this can be for example /usr/local/lib/fpc/... .
Hint: You can see your searchpaths with 'ppc386 -vt bogus'

5. Check that the config file (/etc/fpc.cfg) does not contain search paths to the lcl source files (.pp, .pas):

 forbidden: -Fu(lazarus_source_directory)/lcl
 forbidden: -Fu(lazarus_source_directory)/lcl/interfaces/gtk
If 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:
 -Fu(lazarus_source_directory)/lcl/units/$fpctarget
 -Fu(lazarus_source_directory)/lcl/units/$fpctarget/gtk

6. 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.

7. 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.

8. If you are still not succeeded try to use samplecfg script as follows:

# cd /usr/lib/fpc/version/

# sudo ./samplecfg /usr/lib/fpc/\$version /etc

Note! 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.

I have installed the binary version, but when compiling a simple project, lazarus gives: Fatal: Can't find unit CONTROLS

Probably 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:

 $ bash
 $ svn checkout http://svn.freepascal.org/svn/lazarus/trunk lazarus
 $ cd lazarus
 $ make clean all

Make sure that lazarus get the new source directory: Environment->General Options->Files->Lazarus Directory Top

Lazarus компилируется, но компоновка прерывается с ошибкой: libgdk-pixbuf not found

Для решения проблемы нужно установить библиотеку gdk-pixbuf library для gtk1.x:

Библиотека gdk-pixbuf может быть найдена:

RPM пакет: http://rpmfind.net/linux/rpm2html/search.php?query=gdk-pixbuf&submit=Search+...&system=&arch=

Debian пакет: libgdk-pixbuf-dev

Исходники: ftp://ftp.gnome.org/pub/gnome/unstable/sources/gdk-pixbuf/


Ubuntu 8.10:

Если вы собираете Lazarus с GTK 2.0 вы можете получить ошибку "libgdk-pixbuf2.0 not found" . Для решения проблемы просто установите пакет libgtk2.0-dev, используя команду apt следующим образом (используйте sudo при необходимости):

apt-get install libgtk2.0-dev

Я использую SuSE, при компиляции получаю ошибку: "/usr/bin/ld: cannot find -lgtk Error: Error while linking"

Ранние версии SuSE (до SuSE 11) устанавливали gtk библиотеки devel в директорию /opt/gnome/lib (или /opt/gnome/lib64 для 64-й версии), что не является общепринятым путём для библиотек.

Для решения проблемы, вы можете добавить этот путь библиотеки в конфигурационный файл FPC (/etc/fpc.cfg), следующей строкой:

-Fl/opt/gnome/lib.

Лазарус после установки компонента падает с ошибкой runtime error 211

После установки компонента Лазарус падает со следующей ошибкой:

Threading has been used before cthreads was initialized.
Make cthreads one of the first units in your uses clause.
Runtime error 211 at $0066E188

Как это исправить?

Установленный компонент использует потоки. FPC не включает поддержку многопоточности автоматически на *nix системах, по-этому её необходимо включать вручную. Её включение происходит использованием модуля cthreads. Любое приложение, использующее такой компонент должна использовать этот модуль, причём он должен быть первым подключаемым модулем в программе. Лазарус так же не является исключением.

Подключить модуль cthreads можно двумя способами:

1) Откройте пакет. В редакторе пакетов нажмите на Параметры (Options). Во вкладке Использование (Usage) добавьте настройкуПользовательские (custom) и запишите -dUseCThreads. Пересоберите Лазарус. В этом случае модуль cthreads подключиться автоматически для unix систем.

2) Чтобы не изменять пакет, можно добавить директиву компиляци при сборке самого Лазаруса. Откройте меню Сервис(Tools)->Параметры сборки Lazarus(Configure "build Lazarus)". В диалоге Параметры "Cборки Lazarus"("build Lazarus") в поле "Параметры:"("Options:") впишите -Facthreads и нажмите кнопку "OK". После этого добавьте пакет и пересоберите среду.

Совет: Предыдущая копия Лазаруса (исполнительный файл, который при запуске на выдавал ошибку), скорее всего, находится в той же папке что и текущая версия, но с расширением .old.

См.также:Модули, необходимые для мультипоточных приложений

Когда я запускаю программу, использующую потоки (threads), я получаю сообщение об ошибке "runtime error 232"

Полное сообщение выглядит так:

This binary has no thread support compiled in.
Recompile the application with a thread-driver in the program uses
clause before other units using thread.
Runtime error 232

Решение: Добавьте модуль cthreads в секцию uses главного модуля вашей программы (обычно это .lpr-файл).

У меня Ubuntu Breezy/Mandriva KDE3 и шрифты в Lazarus IDE выглядят слишком большими

Попробуйте следующее: Создайте файл с именем «.gtkrc.mine» в домашней директории (если он не существует) и внесите в него данный текст:

style "default-text" {
       fontset = "-*-arial-medium-r-normal--*-100-*-*-*-*-iso8859-1,\
                  -*-helvetica-medium-r-normal--*-100-*-*-*-*-*-*"
}

class "GtkWidget" style "default-text"

Если это не сработает, попробуйте создать ссылку .gtkrc на .gtkrc.mine. Данный способ был опробован в Xubuntu 7.10 и Mandriva 2009.0 KDE3

Примечание: Если Lazarus был скомпилирован с использованием библиотеки Gtk1.2, то настройка шрифтов в Gtk2 не будет влиять на отображение текста в нём.

Как подключать и использовать сторонние файлы ресурсов (*.rc) в GTK приложении?

Вариант 1. Переименуйте файл ресурсов (rc) мой_ресурс.rc в имя_программы.gtkrc и поместите в папку с исполняемым файлом программы.

Вариант 2. Подключите модуль GtkInt в секцию uses исходного кода проекта (*.lpr), и допишите код

{$IFDEF LCLGtk} 
  GTKWidgetSet.SetRCFilename('имя_вашего_файла_ресурса');
{$ENDIF LCLGtk}

перед вызовом Application.Initialize.

Вариант 3. Используя модуль gtk2 вызовите метод gtk_rc_parse('имя_файла_ресурса') а также gtk_rc_reparse_all.

I have Ubuntu and I cannot compile for Gtk2 due to missing libraries

Ubuntu 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:

cd /usr/lib
sudo ln -s libgdk-x11-2.0.so.0 libgtk-x11-2.0.so

Make sure that the [whatever].so symbolic links are created and point to the actual libraries.

How can I compile a program for Gtk2?

At the moment, the Gtk2 compiled IDE is a little unstable, but you can compile software for Gtk2 using the Gtk1 IDE.

To 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.

Now click Ok and go to the menu "Tools"->"Build Lazarus"

Now you can compile your software with Gtk2 going on the Compiler options and changing the widgetset to Gtk2.

I get this message: "[WARNING] ** Multibyte character encodings (like UTF8) are not supported at the moment."

Since 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.

(original text for older versions of lazarus)
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.

To work around this, just change your locale to a non utf-8 before executing the program on the command line, like this:

export LC_CTYPE="pt_BR"
export LANG="pt_BR"
export LANGUAGE="pt_BR"
./lazarus

Substitute pt_BR with the locale for your country. You can create a script to automate this.

Windows

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.

In 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.

When I cycle the compiler, I get: make[3]: ./ppc1.exe: Command not found

I 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

When I try to make Lazarus I get:

make.exe: * * * interfaces: No such file or directory (ENOENT). Stop.make.exe: * * * [interfaces_all] Error 2

You need to upgrade your make.

makefile:27: *** You need the GNU utils package to use this Makefile. Stop.

Make sure you didn't install FPC in a path with spaces in the name. The Makefile doesn't support it.


How can I give my program an XP look like lazarus has?

Project -> Project Options -> Check 'Use manifest to enables themes'.

Когда я запускаю Windows программу, созданную в Lazarus-е, открывается консольное (DOS) окно

Укажите параметр -WG (Windows графическое приложение) в командной строке компилятора или установите флажок

Проект->Опции проекта->Параметры компилятора -> Связывание -> Графическое приложение Win32 

англ:

Project->Project Options-> Compiler Options -> Linking -> Win32 GUI application.

Mac OS X

Why does compiling a project fail with 'unknown section attribute: no_dead_strip'?

Dead 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

  • Code > Unit style > Smart linkable (-CX)
  • and Linking > Link Style > Link smart (-XX)

Лицензирование

Могу ли я создавать коммерческие приложения, используя Lazarus?

Да, библиотека LCL разрабатывается под лицензией LGPL, что позволяет использовать её без открытия кода вашего приложения. Однако, модификации и расширения LCL должны распространяться с исходным кодом. Сам Lazarus, как IDE, использует лицензию GPL. Отметим, что LCL - это код, содержащийся в файлах из каталога "lcl", прочий код не подпадает под действие указанной лицензии.

Могу ли использовать в коммерческих приложениях дополнительные компоненты Lazarus?

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

Как я могу узнать, что компонент является частью LCL?

Все модули LCL размещаются в подкаталоге "lcl". Также доступен список модулей, входящих в LCL. Если в вашем коде вызываются модули, которых нет в этом списке, вероятно, вы используете компонент, не являющийся частью LCL.

Могу ли я создавать коммерческие плагины для Lazarus?

Да, 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.