# Lazarus Faq/zh CN

العربية (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)

## 一般问题

### 为什么编译成二进制文件会如此之大？

Free Pascal 编译器提供了一个命令行选项 -Xs 来移除这些调试信息。（注意，由于一个 bug，版本 2.0.2 及以前的编译器无法正确执行该选项。）

 strip --strip-all exepath


 upx exepath


• 在 Linux 上，约 700 KB；
• 在 Windows 上，约 420 KB。

• XML 处理库；
• 图像处理库，用于 PNG，XPM，BMP 和 ICO 格式；
• Lazarus 组件库中的几乎所有组件；
• 全部 Free Pascal 运行库。

### How do I compile lazarus?

Do something like this:

$cd lazarus$ make clean all


### 我怎样在基于LCL的基础上建立其它项目

If you can't use the IDE to build your applications, use lazbuild. This is a command line version of the IDE to build lazarus projects and packages. If you want to build LCL applications without the IDE and without the lazbuild, add the following lines to the end of your fpc.cfg

  # searchpath for other toolkits (Linux)
-Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/{YourToolKit}

  # searchpath for other toolkits (Windows)
-Fu/{YourLazarusDirectory}/components/units/{YourToolKit}

Where {YourToolKit} may be gtk2, gnome, qt or win32 and run:
ppc386 your.project.pp

Hint: Don't forget to install the development packages for your toolkit otherwise you might a receive something like: Linker message: cannot find -l.

### fpc都包括哪些版本?

2.0.4 for MacOSX and 2.2.0 for all other systems. Warning: The 2.2.0 has a bug under MacOSX with case sensitive filenames. You can also use the svn version of fpc 2.2.1 and 2.3.x. 2.0.4版苹果和2.2.0所有其它的系统。 注意2.2.0在苹果平台有一个BUG。（译者注：细节自己看吧！）

### 我不能编译 Lazarus

1. 检查编译器版本是否正确
2. 检查（fpc）库文件版本是否相同
3. 检查是否存在fpc.cfg，删除旧的ppc386.cfg文件
4. 也检查一下系统要求的FAQ

### 当我尝试编译一个项目，有一个错误

#### "Cannot find Unit interfaces". How can I solve this?

It means the compiler can not find the file 'interfaces.ppu' or it means it found one, but it is wrong or outdated.

This unit can be found in {LazarusDir}\lcl\units\{TargetCPU}-{TargetOS}\{LCLWidgetSet}\interfaces.ppu. For example: /home/username/lazarus/lcl/units/i386-linux/gtk/interfaces.ppu.

Make sure, it is only there. If you have multiple versions of interfaces.ppu, then you probably have a wrong configuration (for instance you added a lcl directory to a search path). Remove all interfaces.ppu, but the one in the directory above.

If you selected a different widgetset than you used to build lazarus, you need to build the LCL for this widgetset.

If it is there, but you get this error, you are using a different compiler / rtl for compiling your project than you used for compiling your Lazarus IDE. You can do one of the following

• Rebuild the LCL (or Lazarus completely) with the compiler selected in the Environmnent Options. You can do this with Tools -> Build Lazarus. Before doing this, check the current settings in Tools -> Configure Build Lazarus.
• Change the compiler in the Environment Options to the one you used to compile Lazarus. Look carefully also in the Environment Options to see if you are using the correct paths for the Lazarus Directory and the FPC sources directory. Check that there is only one version of the compiler configuration file fpc.cfg - it should reside in /etc/ for Linux/Unix systems or in the same directory as the fpc compiler for Windows systems. Try to run "fpc -vt bogus" to check which fpc.cfg is being used in your system. Rogue copies often creep in if you have updated your compiler to a new version; they may be found in your home directory or in the same directory as the one in which you built your new compiler. DELETE THESE!!
• You may also try to change the widgetset currently selected for the project. For example, the sample project "objectinspector" that comes with Lazarus is set to gtk by default. Compiling this project will surely give you "Can't find unit interfaces" in Windows platform. Changing widgetset to default(Win32) in Project | Compiler Options... | LCL Widget Type (various) should fix this issue.

### 当我尝试在lazarus下编译delphi项目时，有一个错误

#### at the line :{$R *.DFM} How can I solve this problem ? Lazarus (or better Linux) doesn't know about resources, so you can't use them in the way Delphi/Win32 does. However Lazarus uses a method pretty compatible with this. You can still use your Delphi layouts (.dfm files) if you use the following steps: • You need a textual version of the .dfm files. D5 and higher are doing this as default. If you have older files: ALT-F12 to see the layout as text and paste/copy. When you have a text .dfm file, just copy it to a .lfm file. • Create a file with lazres (in lazarus/tools) lazres yourform.lrs yourform.lfm • Add the following initialization section to  initialization {$I yourform.lrs}


Please keep in mind that not all properties in the dfm are supported yet by lazarus, so you might get a crash.

When creating a form Lazarus automaticaly add some extra units to the uses section of your form unit. During the conversion of a delphi unit to a Lazarus unit this does not happen. So you need to add LResources to the Uses section of your form unit.

Make sure, in the Project -> Project Inspector, that your project depends on the package 'LCL' and that you have installed the FPC sources.

Lazarus is the IDE and the visual components library LCL. All other stuff, like IO, Database, FCL and RTL are provided by FPC. The IDE needs the paths to all sources.

The FPC source path can be set via: Environment -> Environment Options -> Files -> FPC source directory

### 怎样将一个小文件嵌入到可执行文件中, 外部需要一个独立的文件? 怎样嵌入一个资源?

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


will create sound.lrs from sound1.wav and sound2.wav.

Then include it *behind* the form lrs file:

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

end.


In your program you can then use:

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


### 我怎样能看到调试输出?

The LCL has in the LCLProc procedure to write debug output:

• DebugLn: works about the same as WriteLn, but accepts only strings.
• DbgOut: works about the same as Write, but accepts only strings.

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. Debug output can also be written to file. The LCLProc unit checks in its initialization the command line parameters for '--debug-log=<file>'. If it finds it sends debug output to <file>. If it doesn't find a --debug-log command line parameter, it looks if an 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 that as file to write debug output to. Example: if you do: set lazarus_debuglog=c:\lazarus\debug.txt  debug output will be written to c:\lazarus\debug.txt. Since this is implemented in lclproc, every application using lclproc, can use this output facility. Debuging Lazarus Most usefull for windows: If you want output on a console, add {$APPTYPE console} to lazarus.pp ; Then rebuild Lazarus.

### Lazarus 的各种各样的文件扩展名有什么意义?

The Lazarus Tutorial#The Lazarus files explains some extensions by an example. Here is a brief list:

*.lpi
Lazarus Project Information file (stored in XML; contains project-specific settings)
*.lpr
Lazarus Program file; contains Pascal source of main program
*.lfm
Lazarus Form file; contains configuration information for all objects on a form (stored in a Lazarus-specific format; the actions are described by Pascal source code in a corresponding *.pas file)
*.pas or *.pp
Unit with Pascal code (typically for a form stored in a corresponding *.lfm file)
*.lrs
Lazarus Resource file (this is a generated file; not to be confused with a Windows resource file).
This file can be created with lazres tool (in directory Lazarus/Tools) using commandline: lazres myfile.lrs myfile.lfm
*.ppu
Compiled unit
*.lpk
Lazarus package information file. (stored in XML; contains package-specific settings)

### I have fixed/improved lazarus. How can I add my changes to the official lazarus source?

Create a patch and send it to the developers. For details see Creating A Patch.

### When I do var mytext: text; to declare a text file, I get "Unit1.pas(32,15) Error: Error in type definition". How can I fix this?

The TControl class has a Text property. In a method of a form, that has higher visibility, the Text type from the system unit. You can use the TextFile type, which is just an alias for the Text type or you can add the unit to the type definition.

var
MyTextFile: TextFile;
MyText: System.Text;


A similar name clash exists with assigning and closing a text file. TForm has a assign and a Close method. You can use AssignFile and CloseFile or add the unit name System.

### I get an error when using Printer.BeginDoc

The unit Printers must be added to the uses section.

The Printer4Lazarus package must be added to your project requirement in the IDE under: Project|Project Inspector|Add|New Requirement|Package Name:

If the package Printer4Lazarus package is not in the list when opening the dropdown box it must be installed. The package is part of the Lazarus installation and can be found in: [lazarus installed directory]\components\printers

If you used the default installation directories [lazarus installed directory] is:

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

The same solution also applies to the exception you can get when referencing Printer.Printers

### Why are TForm.ClientWidth/ClientHeight the same as 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 endless.

Eventually when there is a reliable way to get the size and position of a window with 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.

### I created a Patch to dock the IDE Messages form on the "Source Code Editor" form (at bottom)

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:

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


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. All patches implementing docking without a dock manager makes it harder to implement a real dock manager and will be rejected.

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

First of all: you must learn about Lazarus, to prove their knowledge and skill. Start to 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.

## Where is ... defined

### Virtual key constants

Virtual key constants are defined in LCLType. Add LCLtype to your uses.

## 使用 IDE

### How can I use "identifier completion"?

You can invoke identifier completion by pressing [ctrl][space]. Under the menu item Environment -> Editor Options -> Code Tools -> Automatic Features you can set how quick this should happen automatically.

## Linux

### How can I debug on Linux without the IDE?

First of all you need a debugger. gdb is the standard debugger under linux and there are several GUI-frontends available. One common frontend is ddd, which is part of most common distributions. To compile lazarus/lcl with debug-information you should then use the following commands to start a debug session:

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


Be warned however, that ddd is not as comfortable as e.g. the Lazarus debugger. 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. Therefore you have to type all variable names in uppercase to see their contents. For more information take a look into the 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 aviod 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  [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). 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 Delphis VCL. Kylix 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

Install the gdk-pixbuf library for gtk1.x:

Where to find the gdk-pixbuf library:

Debian packages: libgdk-pixbuf-dev

### I have SuSE and I get /usr/bin/ld: cannot find -lgtk Error: Error while linking

SuSE installs the gtk devel libs under /opt/gnome/lib (or /opt/gnome/lib64 for 64 bits), which is not in the standard lib path. Simply add it to your /etc/fpc.cfg. (-Fl/opt/gnome/lib).

### Lazarus crashes with runtime error 211 after I installed a component

After I installed a component, Lazarus crashes with the following message:

Threading has been used before cthreads was initialized.

### 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 dir exists an OS2 scriptfile named make.cmd. NT sees this also as a script file, so remove it since on NT we don't need it.

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

#### 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?

If you have a myprogram.exe then create a file which called myprogram.exe.manifest and copy-paste this to the file:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity processorArchitecture="*" version="1.0.0.0" type="win32" name="myprogram"/>
<description>programom</description>
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.Windows.Common-Controls"
version="6.0.0.0"
publicKeyToken="6595b64144ccf1df"
language="*"
processorArchitecture="*" />
</dependentAssembly>
</dependency>
</assembly>


Voila! XP looks.

### When I run Windows program created in Lazarus it starts with a DOS window

Specify the -WG argument (Windows GUI) on the command line of the compiler or in the Lazarus IDE check the Windows GUI check box on the compiler options dialog box (Project menu -> Compiler Options -> Linking -> target OS Specific options.

## 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 Mac OS X 10.4.0. Disable the compiler options

• Code > Unit style > Smart linkable (-CX)

--Comment: I don't believe this is tied to a particular version of OS X, but rather to the version of Xcode installed. See this link. On my PowerPC 10.4.11 system with Xcode 2.4.1 and FPC 2.2.0, both -CX and -XX work, but the code savings appear to be negligible.

## 许可

### 为什么有些组件不能用于商业应用程序？

Lazarus 带有附加组件，它们由第三方开发，也有着不同的许可方式。如果您需要使用它们，请参阅他们各自的许可文件。

### How do I know if a Component is part of the 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.

### Can I make commercial plug-ins for 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.