Difference between revisions of "Lazarus Faq/it"

From Free Pascal wiki
Jump to navigationJump to search
Line 40: Line 40:
 
''' Tabella delle dimensioni di una applicazione vuota con varie impostazioni e sistemi operativi'''
 
''' Tabella delle dimensioni di una applicazione vuota con varie impostazioni e sistemi operativi'''
  
Ho fatto girare i test che ho fatto su Lazarus 0.9.29 con FPC 2.4 (FPC 2.2.4 sotto Windows). ''Compilatore ottimizzato'' significa usare i consigli dati qui sopra ma ''senza usare UPX''; ''Default Lazarus'' significa usando Lazarus con le impostazioni di default che ha appena installato; ''LCL senza info di debug'' significa dopo aver ricompilato la LCL e la IDE di Lazarus senza le informazioni di debug (-g-).
+
Ho fatto girare i test che ho fatto su Lazarus 0.9.29 con FPC 2.4 (FPC 2.2.4 sotto Windows). ''Compilatore ottimizzato'' significa usare i consigli dati qui sopra ma ''senza usare UPX''; ''Lazarus base'' significa usando Lazarus con le impostazioni di default che ha appena installato; ''LCL no debug'' significa dopo aver ricompilato la LCL e la IDE di Lazarus senza le informazioni di debug (-g-).
  
 
<TABLE WIDTH=642 BORDER=0 CELLPADDING=1 CELLSPACING=0>
 
<TABLE WIDTH=642 BORDER=0 CELLPADDING=1 CELLSPACING=0>
Line 48: Line 48:
 
<TD WIDTH=111>Lazarus base</TD>
 
<TD WIDTH=111>Lazarus base</TD>
 
<TD WIDTH=14>&nbsp; &nbsp;</TD>
 
<TD WIDTH=14>&nbsp; &nbsp;</TD>
<TD WIDTH=220>LCL without debug informations</TD>
+
<TD WIDTH=220>LCL no debug</TD>
 
</TR>
 
</TR>
 
<TR VALIGN=TOP>
 
<TR VALIGN=TOP>
Line 135: Line 135:
 
</TR>
 
</TR>
 
</TABLE>
 
</TABLE>
 
<!--
 
  
 
=== 'Fatal: Circular unit reference between a and b' ===
 
=== 'Fatal: Circular unit reference between a and b' ===
  
A common thing happened to a new user when one wants to create two forms referencing each other's properties. The error above only happens to uses clause of interface section, thus it's OK to put it in implementation section. Example:
+
Una cosa che capita spesso a un nuovo utente quando crea due unit che fanno riferimento ognuna alle proprietà dell'altra. L'errore di cui sopra avviene quando si mette la clausola uses nella sezione interface, mentre va invece messa nella sezione implementation. Esempio:
  
This one causes error:
+
Questo codice causerà l'errore:
 +
<code>
 
   unit a;
 
   unit a;
 
    
 
    
Line 162: Line 161:
 
    
 
    
 
   end.
 
   end.
But this one doesn't:
+
</code>
 +
 
 +
Questo invece no:
 +
 
 +
<code>
 
   unit a;
 
   unit a;
 
    
 
    
Line 182: Line 185:
 
    
 
    
 
   end.
 
   end.
 +
</code>
  
=== Why is the linking so slow on Windows? ===
+
=== Perché il linking è così lento sotto Windows? ===
 
 
This problem is fixed in FPC 2.2 and Lazarus 0.9.24. Please update your Lazarus. For older versions read text below.
 
  
Generally speaking, compilation on Windows takes more time then other platforms because the GNU Linker utilized by Free Pascal is slow on this platform. This problem only affects Windows, and is only bad on relatively old computers (less then 1Ghz) and computers with little RAM (128MB or less).
+
Questo problema è stato risolto in FPC 2.2 e Lazarus 0.9.24: per favore aggiornate la vostra versione di Lazarus. Per le versioni più vecchie, leggete il seguito.
  
Also, if you smartlink LCL the linking will be much slower. A study about this is located here: [[File size and smartlinking]]
+
In generale, la compilazione sotto Windows è penalizzata a causa del linker GNU, che è molto più lento su questa piattaforma. Questo problema affligge solo Windows, ed è davvero grave solo su macchine relativamente anziane (CPU clock minore di 1 GHz) o con poca RAM (128MB o meno). Ugualmente, se usate lo smartlink per la LCL il linking sarà molto più lento. Potete leggere i dettagli qui: [[File size and smartlinking]].
  
A internal linker was developed, and is ready, but will only be available when Free Pascal 2.2 is released (of course it's also available via subversion). It decreases the linking time dramatically.
+
E' stato sviluppato (ed è pronto) un linker interno parecchio più veloce, ma sarà disponibile solo con il rilascio di Free Pascal 2.2. Se non potete aspettare, è disponibile via subversion.
  
'''Note''': In 2.1.1 Windows uses an internal linker for win32/64/ce which speeds the process up a bit. A Lazarus recompile then eats about 280MB.
+
'''Nota''': Nella versione 2.1.1 Windows usa un linker interno per win32/64/ce che accelera un pò il linking; una riompilazione di Lazarus richiederebbe circa 280MB.
  
=== Do I need ppc386.cfg or fpc.cfg? ===
+
=== Mi serve ppc386.cfg oppure fpc.cfg? ===
  
You only need fpc.cfg. This way the compiler knows where to find the libraries.
+
Vi serve solo fpc.cfg. In questo file sono contenute le informazioni necessarie al compilatore per trovare le librerie.
  
=== How do I compile lazarus? ===
+
=== Come compilo Lazarus? ===
  
Do something like this:
+
Così:
 
  $ cd lazarus
 
  $ cd lazarus
 
  $ make clean all
 
  $ make clean all
  
=== How do I build other projects based upon the 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)
+
=== Come faccio la build di altri progetti basati sulla LCL? ===
  -Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/{YourToolKit}
+
 
 +
Se non puotete usare la IDE per fare la vostra build allora usate lazbuild, che è una versione a linea di comando della IDE appositamente pensata per fare build di di progetti e package Lazarus. Se invece volete fare le build dei vostri progetti senza IDE e senza lazbuild, allora aggiungete queste righe in fondo al vostro file ''fpc.cfg''
  
   # searchpath for other toolkits (Windows)
+
   # path del vostro sistema di build (per Linux)
  -Fu/{YourLazarusDirectory}/components/units/{YourToolKit}
+
  -Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/{VostroSistemaDiBuild}
  
:Where {YourToolKit} may be ''gtk2'', ''gnome'', ''qt'' or ''win32'' and run:
+
  # path del vostro sistema di build (per Windows)
 +
  -Fu/{DirectoryDelVostroLazarus}/components/units/{VostroSistemaDiBuild}
 +
 
 +
:{VostroSistemaDiBuild} può essere ''gtk2'', ''gnome'', ''qt'' o ''win32'' e lanciare:
 
::ppc386 your.project.pp
 
::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]].
+
'''consiglio:''' non dimenticate di installare il package di sviluppo per il vostro sistema di build, altrimenti potreste ricevere un errore del tipo: [[Linker message: cannot find -l]].
  
=== What version of FPC is required? ===
+
=== Quale versione di FPC è necessaria? ===
  
Lazarus 0.9.28 requires at least FPC 2.4.
+
Lazarus 0.9.28 richiede almeno FPC 2.4.
  
=== I can't compile Lazarus ===
+
=== Non riesco a compilare Lazarus ===
  
# Check if the compiler has the correct version
+
# Accertatevi che la versione del compilatore sia quella giusta
# Check if the (fpc)libraries are from the same version
+
# Accertatevi che le librerie (fpc) siano della stessa versione del compilatore
# Check if the compiler installation path has spaces in it. Make sure it doesn't!
+
# Accertatevi che il path di installazione del compilatore NON contenga spazi!
# Check if you have a fpc.cfg and no old ppc386.cfg
+
# Accertatevi di avere il file fpc.cfg e non il vecchio ppc386.cfg
# Check also the OS-dependent FAQs
+
# Consultate le FAQ dipendenti dal sistema operativo su cui lavorate
  
=== When I try to compile a project, I get an error message ===
+
=== Quando cerco di compilare un progetto, ottengo un errore ===
==== "Cannot find Unit interfaces". How can I solve this?====
+
==== "Cannot find Unit interfaces". Come lo risolvo?====
It means the compiler can not find the file 'interfaces.ppu' '''or''' it means it found one, but it is wrong or outdated.
+
Significa che il compilatore non trova il file 'interfaces.ppu' '''oppure''' lo trova, ma è errato o troppo vecchio.
  
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.
+
Questa unit si può trovare in {LazarusDir}\lcl\units\{TargetCPU}-{TargetOS}\{LCLWidgetSet}\interfaces.ppu. Per esempio: /home/username/lazarus/lcl/units/i386-linux/gtk/interfaces.ppu.
 +
 
 +
Assicuratevi che stia lì e solamente lì; se avete diverse versioni di 'interfaces.ppu' in luoghi diversi, è probabile che la vostra configurazione sia sbagliata (per esempio perché avete aggiunto una directory lcl a un path di ricerca). Cancellate tutte le copie di 'interfaces.ppu' tranne quella nella directory indicata sopra.
 +
 
 +
<!--
  
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 you selected a different widgetset than you used to build lazarus, you need to build the LCL for this widgetset.  

Revision as of 07:51, 1 February 2011

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

Questioni generiche

Perché i file binari generati sono così grandi?

Sono grandi perché includono una grande quantità di informazioni di debug necessarie per l'uso di gdb (GNU Debugger). Il compilatore ha un'opzione (-Xs) che toglie le informazioni di debug dagli eseguibili, ma nelle versioni 2.0.2 e precedenti non funzionava a causa di un bug, che è stato corretto a partire dalla versione 2.0.4 e successive del compilatore FreePascal.

Si può usare il programma "strip" per rimuovere i simboli di debug dagli eseguibili; si trova nella directory lazarus\pp\bin\i386-win32\. Basta dare il comando "strip --strip-all <nome e pathname del vostro eseguibile>" dalla linea di comando. Per rendere ancora più piccolo il vostro eseguibile usate UPX, un ottimo exe packer; non causa overhead di memoria perché usa un algoritmo di decompressione in-place, ed ha una velocità di decompressione veramente buona (~10 MB/sec su un Pentium 133).

Per usare upx date il comando "upx <nome e pathname del vostro eseguibile>" dalla linea di comando. Dopo aver usato entrambi questi programmi su un semplice programma GUI creato con Lazarus si ottiene:

  • ~ 700kb su Linux
  • ~ 420kb su Windows

Una discussione più approfondita dei pro e contro dell'uso di UPX si trova nell'articolo Size Matters.

E' inoltre importante notare che anche un semplice hello world creato con Lazarus include già un gran numero di funzioni, fra le quali:

  • librerie di gestione di XML
  • librerie di gestione immagini per file png, xpm, bmp e ico
  • Praticamente tutti i widget della Lazarus Component Library
  • Tutta la libreria di runtime del Free Pascal

Per cui è sì molto grande, ma include quasi tutto quello che serve a un'applicazione reale che sia un minimo complessa. Gli eseguibili generati da Lazarus sono grandi inizialmente, ma crescono molto poco al crescere della complessità dell'applicazione, grazie alle proprietà del Free Pascal e del modo in cui funzionano i form di Lazarus. Un progetto C++ (ma anche in molti altri linguaggi e tool) inizia con dimensioni dell'exe molto piccole, ma che crescono esponenzialmente quando si aggiungono funzionalità realmente utili e non banali.

Lazarus vs cpp.png

Guida rapida alla riduzione della dimensione degli eseguibili generati da Lazarus/FPC (testato con Lazarus 0.9.26)

  • 1. Project|Compiler Options|Code|Smart Linkable (-CX) -> Selezionato
  • 2. Project|Compiler Options|Linking|Debugging| Deselezionare tutto tranne

Strip Symbols From Executable (-Xs) -> Selezionato

  • 3. Project|Compiler Options|Linking|Link Style|Link Smart (-XX) -> Selezionato

La parte più importante sembra essere la 2. Per una semplice applicazione, la dimensione dell'eseguibile dovrebbe ora essere 1-3 MB invece di 15-20 MB. A questo punto potreste provare anche:

  • 4. Project|Compiler Options|Code|Optimizations|smaller rather than faster -> Selezionato (Attenzione: potrebbe penalizzare la velocità di esecuzione)
  • 5. (opzionale) usate UPX <vostro_eseguibile> per comprimere il file binario di un fattore due o tre. (Attenzione: come già detto, ci sono alcuni svantaggi nell'uso di UPX).

Tabella delle dimensioni di una applicazione vuota con varie impostazioni e sistemi operativi

Ho fatto girare i test che ho fatto su Lazarus 0.9.29 con FPC 2.4 (FPC 2.2.4 sotto Windows). Compilatore ottimizzato significa usare i consigli dati qui sopra ma senza usare UPX; Lazarus base significa usando Lazarus con le impostazioni di default che ha appena installato; LCL no debug significa dopo aver ricompilato la LCL e la IDE di Lazarus senza le informazioni di debug (-g-).

    Lazarus base     LCL no debug
Ubuntu 64 bit / Lazarus 64 bit
Applicazione vuota     13,4  Mb     7,5 Mb / 8
Compilatore ottimizzato     4,4 Mb     2,70 Mb (0.29svn FPC2.4 2,5)
   
Ubuntu 32 bit / Lazarus 32 bit
Applicazione vuota     19,6  Mb     5,7 Mb
Compilatore ottimizzato     2,9 Mb     1,6 Mb
   
Windows XP 32 bit / Lazarus 32 bit
Applicazione vuota     11,8 Mb     2,14 Mb
Compilatore ottimizzato     1,62 Mb     1,50 Mb
   
Windows Seven 64 bit / Lazarus 64 bit
Applicazione vuota     12,3  Mb     3,20 Mb
Compilatore ottimizzato     2,14 Mb     2,16 Mb

'Fatal: Circular unit reference between a and b'

Una cosa che capita spesso a un nuovo utente quando crea due unit che fanno riferimento ognuna alle proprietà dell'altra. L'errore di cui sopra avviene quando si mette la clausola uses nella sezione interface, mentre va invece messa nella sezione implementation. Esempio:

Questo codice causerà l'errore:

 unit a;
 
 interface
 
 uses b;
 
 implementation
 
 end.
 ...
 unit b;
 
 interface
 
 uses a;
 
 implementation
 
 end.

Questo invece no:

 unit a;
 
 interface
 
 implementation
 
 uses b;
 
 end.
 ...
 unit b;
 
 interface
 
 implementation
 
 uses a;
 
 end.

Perché il linking è così lento sotto Windows?

Questo problema è stato risolto in FPC 2.2 e Lazarus 0.9.24: per favore aggiornate la vostra versione di Lazarus. Per le versioni più vecchie, leggete il seguito.

In generale, la compilazione sotto Windows è penalizzata a causa del linker GNU, che è molto più lento su questa piattaforma. Questo problema affligge solo Windows, ed è davvero grave solo su macchine relativamente anziane (CPU clock minore di 1 GHz) o con poca RAM (128MB o meno). Ugualmente, se usate lo smartlink per la LCL il linking sarà molto più lento. Potete leggere i dettagli qui: File size and smartlinking.

E' stato sviluppato (ed è pronto) un linker interno parecchio più veloce, ma sarà disponibile solo con il rilascio di Free Pascal 2.2. Se non potete aspettare, è disponibile via subversion.

Nota: Nella versione 2.1.1 Windows usa un linker interno per win32/64/ce che accelera un pò il linking; una riompilazione di Lazarus richiederebbe circa 280MB.

Mi serve ppc386.cfg oppure fpc.cfg?

Vi serve solo fpc.cfg. In questo file sono contenute le informazioni necessarie al compilatore per trovare le librerie.

Come compilo Lazarus?

Così:

$ cd lazarus
$ make clean all


Come faccio la build di altri progetti basati sulla LCL?

Se non puotete usare la IDE per fare la vostra build allora usate lazbuild, che è una versione a linea di comando della IDE appositamente pensata per fare build di di progetti e package Lazarus. Se invece volete fare le build dei vostri progetti senza IDE e senza lazbuild, allora aggiungete queste righe in fondo al vostro file fpc.cfg

  # path del vostro sistema di build (per Linux)
  -Fu/usr/lib/fpc/$fpcversion/units/$fpctarget/{VostroSistemaDiBuild}
  # path del vostro sistema di build (per Windows)
 -Fu/{DirectoryDelVostroLazarus}/components/units/{VostroSistemaDiBuild}
{VostroSistemaDiBuild} può essere gtk2, gnome, qt o win32 e lanciare:
ppc386 your.project.pp

consiglio: non dimenticate di installare il package di sviluppo per il vostro sistema di build, altrimenti potreste ricevere un errore del tipo: Linker message: cannot find -l.

Quale versione di FPC è necessaria?

Lazarus 0.9.28 richiede almeno FPC 2.4.

Non riesco a compilare Lazarus

  1. Accertatevi che la versione del compilatore sia quella giusta
  2. Accertatevi che le librerie (fpc) siano della stessa versione del compilatore
  3. Accertatevi che il path di installazione del compilatore NON contenga spazi!
  4. Accertatevi di avere il file fpc.cfg e non il vecchio ppc386.cfg
  5. Consultate le FAQ dipendenti dal sistema operativo su cui lavorate

Quando cerco di compilare un progetto, ottengo un errore

"Cannot find Unit interfaces". Come lo risolvo?

Significa che il compilatore non trova il file 'interfaces.ppu' oppure lo trova, ma è errato o troppo vecchio.

Questa unit si può trovare in {LazarusDir}\lcl\units\{TargetCPU}-{TargetOS}\{LCLWidgetSet}\interfaces.ppu. Per esempio: /home/username/lazarus/lcl/units/i386-linux/gtk/interfaces.ppu.

Assicuratevi che stia lì e solamente lì; se avete diverse versioni di 'interfaces.ppu' in luoghi diversi, è probabile che la vostra configurazione sia sbagliata (per esempio perché avete aggiunto una directory lcl a un path di ricerca). Cancellate tutte le copie di 'interfaces.ppu' tranne quella nella directory indicata sopra.