Difference between revisions of "Unit not found - How to find units/de"

From Lazarus wiki
Jump to navigationJump to search
m
 
(19 intermediate revisions by 4 users not shown)
Line 4: Line 4:
  
 
Diese Seite handelt von einem der bedeutendsten Fehler in Pascal: '''unit not found''' bzw. '''can't find unit'''.
 
Diese Seite handelt von einem der bedeutendsten Fehler in Pascal: '''unit not found''' bzw. '''can't find unit'''.
Dieser Fehler kann eine Menge von Gründen haben und diese Seite versucht die meisten von ihnen zu erfassen, weiterhin wie man sie herausfindet, um welches Problem es sich handelt und wie man eine Lösung dafür findet.
+
Dieser Fehler kann eine Menge von Ursachen haben. Diese Seite versucht die meisten von ihnen zu erfassen, weiterhin wie man sie herausfindet, um welches Problem es sich handelt und wie man eine Lösung dafür findet.
 +
 
 +
Es gibt ein Werkzeug, um auf viele übliche Fehlkonfigurationen zu prüfen: Projekt -> Compilereinstellungen ... -> Test. Starten Sie es und sehen Sie sich die erstellten Warnungen an. Normalerweise sollte es vor einigen doppelten ppu-Dateien in den FPC-Quellen warnen (die Dateien hängen von der FPC Version und der Distribution ab).
 +
 
 +
== Quicklist ==
 +
 
 +
Für Experten ist hier eine Liste möglicher Gründe für den Fehler. Diese Liste ist nicht nach Wahrscheinlichkeit sortiert.
 +
 
 +
*FPC Installation
 +
**Sie haben eine Ihrer Units wie eine FPC Unit benannt.
 +
**Falsche fpc.cfg. $HOME/.fpc.cfg anstelle von /etc/fpc.cfg. Herauszufinden mit -vut.
 +
**Fehlender oder falscher Suchpfad in der fpc.cfg. Herauszufinden mit -vut.
 +
**Cross compiling: Forgot to install the cross compiled FPC ppus. Herauszufinden mit -vut.
 +
**Zerschossene FPC Installation. Entfernen Sie das FPC Verzeichnis manuell und installieren Sie FPC erneut.
 +
**Compiler symlink zeigt auf den falschen Compiler.
 +
**FPCDIR Umgebungsvariable ist falsch gesetzt
 +
*Lazarus
 +
**Falsche Schreibweise. Wenn der Dateiname einer Unit Buchstaben in Groß- und Kleinschreibweise enthält, müssen auch sämtliche uses-Klauseln die richtige Schreibweise verwenden. Vor Version 0.9.29 suchte die IDE nicht 'in' Dateinamen nach Klein- und Großschreibweise. Überprüfen Sie die Dateinamen in den uses-Abschnitten.
 +
**Falsche Unit: Wenn es zwei Units mit dem selben Dateinamen im Suchpfad gibt, könnte der Compiler ohne Warnhinweis die falsche Unit verwendet haben. Normalerweise warnt die IDE, aber das ist in ''Einstellungen -> Umgebungseinstellungen -> Namensvergabe -> Mehrdeutige Dateiaktion'' vielleicht deaktiviert.
 +
**Vergessen, die FPC-Quelltexte zu installieren und/ oder vergessen, den Pfad zu setzen in ''Einstellungen -> Umgebungseinstellungen -> Dateien -> FPC-Quelltextverzeichnis''.
 +
**Verwendung der falschen Version der FPC Quellen
 +
**Verwendung des falschen Compilers. Prüfen Sie ''Einstellungen -> Umgebungseinstellungen -> Dateien -> Compilerdateiname''.
 +
**Verwendung des falschen Lazarus Verzeichnisses. Prüfen Sie ''Einstellungen -> Umgebungseinstellungen -> Dateien -> Lazarus-Verzeichnis''.
 +
**Forgot to add a package dependency. Check project inspector or package editor.
 +
**Added a search path to your own units to fpc.cfg instead of creating a package.
 +
**Falsch geschriebene oder fehlende Suchpfade. Check ''project / compiler options'', pages ''Paths'' and ''Inherited'' and check ''source editor / popup menu / file settings / unit info / unit paths''.
 +
**Cross compiling: Forgot to cross compile lcl, synedit for the new platform. Diese werden nicht automatisch kompiliert.
 +
**Eine ppu Datei existiert zweifach. Herauszufinden mit -vut. Entfernen Sie die falsche ppu Datei. Check if two packages or a package and the project contain the same unit search path in their compiler options.
  
 
== Schreibweisen und Ausdrücke ==
 
== Schreibweisen und Ausdrücke ==
  
* '''.pas''' Datei: Dies ist ein Platzhalter für jede Pascal-Unit-Quelldatei. Zum Beispiel unit1.pas oder unit1.pp. Beide Erweiterungen sind erlaubt und zwischen ihnen gibt es keine Unterschiede. Es gibt andere Compiler, welche .pp Dateien ignorieren, aber diese Seite behandelt den Free Pascal Compiler.
+
* '''.pas''' Datei: Dies ist ein Platzhalter für jede Pascal-Unit-Quelldatei. Zum Beispiel unit1.pas oder unit1.pp. Beide Erweiterungen sind erlaubt und zwischen ihnen gibt es keine Unterschiede. Es gibt andere Compiler, die .pp Dateien ignorieren, aber diese Seite behandelt den Free Pascal Compiler.
 
* '''.pp''' Datei: Das selbe wie .pas. Nur eine andere Erweiterung für die selbe Sache.
 
* '''.pp''' Datei: Das selbe wie .pas. Nur eine andere Erweiterung für die selbe Sache.
 
* '''.p''' Datei: Das selbe wie .pas. Nur eine andere Erweiterung für die selbe Sache. Üblicherweise genutzt auf Macintosh.
 
* '''.p''' Datei: Das selbe wie .pas. Nur eine andere Erweiterung für die selbe Sache. Üblicherweise genutzt auf Macintosh.
Line 15: Line 42:
 
== Schritt 1: Compiler oder IDE oder beide ==
 
== Schritt 1: Compiler oder IDE oder beide ==
  
Der erste Schritt besteht darin herauszufinden, ob die IDE die Unit nicht finden kann oder der Compiler sie nicht finden kann oder beides.
+
Die IDE und der Compiler verwenden nicht exakt die selben Wege um Units zu lokalisieren.
 +
 
 +
=== Compiler ===
 +
 
 +
Wenn der Compiler sie nicht finden kann, schlägt die Kompilierung fehl (Erstellen, Strg+F9) mit der Fehlermeldung 'unit not found'.  
  
Obwohl der Compiler und die IDE ziemlich ähnliche Suchalgorithmen verwenden, um eine Unit zu finden, gibt es einige Unterschiede. Deshalb kann manchmal die IDE eine Unit finden, welche der Compiler nicht finden kann und umgekehrt. If the compiler can not find it, the compilation fails (Build, Ctrl+F9) with the error 'unit not found'. If the IDE can not find, the code tools will fail. For example ''Find Declaration'' (Alt+Up or Ctrl+Left mouse button) or ''Identifier completion'' (Ctrl+Space) will fail with the same error 'unit not found'.
+
=== IDE ===
 +
 
 +
Wenn die IDE sie nicht finden kann, werden die CodeTools fehlschlagen. Zum Beispiel ''Find Declaration'' (Alt+Up oder Strg+Linke Maustaste) oder ''Bezeichnervervollständigung'' (Strg+Space) werden mit der Fehlermeldung 'unit not found' fehlschlagen. If the error message is about units you don't use directly, then simply add the unit name to a uses section and do a find declaration. After that you can remove it.
 +
 
 +
=== Suchstrategien ===
 +
 
 +
==== Was beide suchen ====
  
Gemeinsamkeiten:
 
 
* Beide suchen Units in den Suchpfaden.  
 
* Beide suchen Units in den Suchpfaden.  
 
* Beide suchen zuerst nach Pascal-Quelldateien (.pas, .pp). Im MacPAS Modus wird auch nach .p Dateien gesucht.
 
* Beide suchen zuerst nach Pascal-Quelldateien (.pas, .pp). Im MacPAS Modus wird auch nach .p Dateien gesucht.
Line 31: Line 67:
 
Sie werden in jedem Verzeichnis des Suchpfades gesucht.
 
Sie werden in jedem Verzeichnis des Suchpfades gesucht.
  
Unterschiede:
+
==== Unterschiede zwischen IDE und FPC Unit-Suche ====
 +
 
 
* FPC verwendet die fpc.cfg Datei für zusätzliche Suchpfade. Die IDE verwendet sie nur, um Dateien der FPC Quellen zu finden. Daher wird das Hinzufügen von Suchpfaden zu fpc.cfg von Lazarus ignoriert.
 
* FPC verwendet die fpc.cfg Datei für zusätzliche Suchpfade. Die IDE verwendet sie nur, um Dateien der FPC Quellen zu finden. Daher wird das Hinzufügen von Suchpfaden zu fpc.cfg von Lazarus ignoriert.
* FPC always starts in one directory and every relative filename is relative to this directory. For the Lazarus IDE each project and each package has its own base directory. So the search path of a package is relative to the package directory. The package directory is the directory of the .lpk file. The base directory of a project is the projects main source file (e.g. the .lpr file). If there is no main source file, the directory of the .lpi file is taken. Normally both are the same and the IDE has no graphical frontend to split. But by editing the .lpi file manually you can split them. At the moment there is only one prominent example for this case: the ppxxx.lpi files of the Free Pascal compiler.
+
* FPC always starts in one directory and every relative filename is relative to this directory. Für die Lazarus IDE hat jedes Projekt und jedes Package sein eigenes Basisverzeichnis. Daher ist der Suchpfad eines Packages relativ zum Package-Verzeichnis. Das Package-Verzeichnis ist das Verzeichnis der .lpk Datei. Das Basisverzeichnis eines Projekts ist das Verzeichnis der Projekt-Hauptquelldatei (z.B. die .lpr Datei). Wenn es keine Hauptquelldatei gibt, wird das Verzeichnis der .lpi Datei genommen. Normalerweise sind beide identisch und die IDE has no graphical frontend to split. But by editing the .lpi file manually you can split them. Im Moment gibt es nur ein prominentes Beispiel für diesen Fall: die ppxxx.lpi Dateien des Free Pascal Compilers.
 
* FPC und Lazarus haben unterschiedliche Makros.
 
* FPC und Lazarus haben unterschiedliche Makros.
* Sie können zusätzliche Quellensuchpfade definieren, welche nicht an den Compiler übergeben werden. (Compilereinstellungen -> Andere Quellen)
+
* Sie können zusätzliche Quellensuchpfade definieren, die nicht an den Compiler übergeben werden. (Compilereinstellungen -> Andere Quellen)
  
 
== Fall 1: Beide können die Unit nicht finden ==
 
== Fall 1: Beide können die Unit nicht finden ==
  
* '''Prüfen sie, ob die Unit existiert''': Wenn nicht, then see chapter Searching packages, projects of a unit (ToDo: write me).
+
* '''Prüfen Sie, ob die Unit existiert''': Wenn nicht, then see chapter Searching packages, projects of a unit (ToDo: write me).
* '''Prüfen sie, ob die Unit lesbar ist''': (Sie können sie in der IDE öffnen). A unit source does not need to be writable. If not, then fix the permissions or get a readable copy.
+
* '''Prüfen Sie, ob die Unit lesbar ist''': (Sie können sie in der IDE öffnen.) (Eine Unit Quelldatei benötigt keine Schreibrechte.) Wenn nicht, dann korrigieren Sie die Berechtigungen oder besorgen Sie sich eine lesbare Kopie.
* '''Prüfen sie, ob die Unit einen gültigen Pascal-Namen hat''': (Bezeichner plus Erweiterung). Gültige Beispiele: unit1.pas, Bogus2.pp, _1.pas, LAZ.PAS. Ungültige Beispiele: 1.pas (beginnt mit einer Ziffer), a%.pas (enthält spezielles Zeichen), unit.PAS (Erweiterung großgeschrieben aber Dateiname kleingeschrieben).
+
* '''Prüfen Sie, ob die Unit einen gültigen Pascal-Namen hat''': (Bezeichner plus Erweiterung). Gültige Beispiele: unit1.pas, Bogus2.pp, _1.pas, LAZ.PAS. Ungültige Beispiele: 1.pas (beginnt mit einer Ziffer), a%.pas (enthält spezielles Zeichen), unit.PAS (Erweiterung großgeschrieben aber Dateiname kleingeschrieben).
* '''Prüfen sie, ob der Verzeichnisname spezielle Zeichen enthält'''
+
* '''Prüfen Sie, ob der Verzeichnisname spezielle Zeichen enthält'''
 
<pre>
 
<pre>
   1. Slash / und Backslash \ werden als Verzeichnis-Begrenzungszeichen verwendet und sollten niemals für Verzeichnisnamen verwendet werden
+
   1. Slash / und Backslash \ werden als Verzeichnis-Begrenzungszeichen verwendet und sollten niemals für Verzeichnisnamen verwendet werden.
   2. Dollar $ wird in vielen Skriptsprachen für Makros verwendet
+
   2. Semikolons werden in der IDE verwendet um Pfade zu trennen.
 +
  3. Dollar $ wird in vielen Skriptsprachen für Makros verwendet.
 
</pre>
 
</pre>
* '''Prüfen sie die richtige Schreibweise''': If your unit name is all lowercase or all uppercase you don't need to worry. If not, then you must make sure, that '''every''' uses section in every source code uses exactly this case. For example: if your unit is named Unit1.pas, then every uses section must use Unit1. This is not so important under windows, but under any other platform (Linux, MacOSX). The IDE gives warnings when saving files with mixed case.
+
* '''Prüfen Sie die richtige Schreibweise''': Wenn Ihr Unitname komplett kleingeschrieben oder komplett großgeschrieben ist, müssen Sie sich keine Sorgen machen. Falls nicht, müssen Sie sicherstellen, dass '''jeder''' uses Abschnitt in jedem Quelltext exakt diese Schreibweise verwendet. Zum Beispiel: falls ihre Unit Unit1.pas heißt, dann muss jeder uses-Abschnitt Unit1 verwenden. Dies ist nicht so wichtig unter Windows, aber unter jeder anderen Plattform (Linux, MacOSX). Die IDE gibt Warnmeldungen aus, wenn Sie Dateien mit gemischter Schreibweise speichern wollen.
* '''Prüfen sie, ob die Unit im Suchpfad ist'''. ToDo: write me
+
* '''Prüfen Sie, ob die Unit im Suchpfad ist'''. Wenn die Kompilierung während des Kompilieren eines Packages stoppt, schauen Sie in den Compilereinstellungen dieses Packages nach (öffnen Sie das Package, dort gibt es einen Button 'Compilereinstellungen'). Wenn die Kompilierung während des Kompilierens eines Projekts stoppt, dann schauen Sie unter Projekt -> Compilereinstellungen nach.
  
 
== Fall 2: Der Compiler findet eine Unit, aber die IDE nicht ==
 
== Fall 2: Der Compiler findet eine Unit, aber die IDE nicht ==
  
Der nächste Fall setzt voraus, daß Start -> Erstellen (Ctrl+F9) in der Lazarus IDE funktioniert, aber Find Declaration mit der Fehlermeldung: unit not found fehlschlägt.
+
Der nächste Fall setzt voraus, dass Start -> Erstellen (Strg+F9) in der Lazarus IDE funktioniert, aber 'Find Declaration' mit der Fehlermeldung: 'unit not found' fehlschlägt.
Wenn sie unsicher sind, prüfen sie auch Fall 1.
+
Wenn Sie unsicher sind, prüfen Sie auch Fall 1.
  
* '''Prüfen sie, ob der Unit-Quelltext existiert''': Die IDE sucht nach Pascal Quellen (.pas, .pp) und ignoriert die .ppu Dateien. Der Compiler kann eine .ppu Datei verwenden aber die Lazarus IDE nicht. Dieses Feature ist geplant, aber es gibt noch keinen Zeitrahmen.
+
* '''Prüfen Sie, ob der Unit-Quelltext existiert''': Die IDE sucht nach Pascal Quellen (.pas, .pp) und ignoriert die .ppu Dateien. Der Compiler kann eine .ppu Datei verwenden, aber die Lazarus IDE nicht. Dieses Feature ist geplant, aber es gibt noch keinen Zeitrahmen.
* '''Prüfen sie, ob der Unit-Pfad zu ihrer fpc.cfg hinzugefügt wurde''': Der Compiler benutzt alle Pfade, die in der fpc.cfg Datei definiert sind. Die IDE liest diese Datei nicht. Add the search path to the compiler options of your projects and/or packages.
+
* '''Prüfen Sie, ob der Unit-Pfad zu ihrer fpc.cfg hinzugefügt wurde''': Der Compiler benutzt alle Pfade, die in der fpc.cfg Datei definiert sind. Die IDE liest diese Datei nicht. Fügen Sie den Suchpfad zu den Compilereinstellungen Ihres Projekts und/oder Packages hinzu.
* '''Check for macros and special compiler flags''': The compiler understands the asterisk * character in search paths. The IDE treats this character as normal character. You can add the -Fu, -FU, -FE flags manually to the custom compiler flags in the lazarus IDE, but they are not parsed. Always use the right fields for options. The '''custom options''' are only for flags like the -D flag or uncommon compiler options, like new features of the unstable developer compiler.
+
* '''Check for macros and special compiler flags''': Der Compiler versteht das Stern- * zeichen in den Suchpfaden. Die IDE behandelt dieses Zeichen als normales Zeichen. You can add the -Fu, -FU, -FE flags manually to the custom compiler flags in the lazarus IDE, but they are not parsed. Always use the right fields for options. The '''custom options''' are only for flags like the -D flag or uncommon compiler options, like new features of the unstable developer compiler.
  
 
== Fall 3: Die IDE findet eine Unit, aber der Compiler nicht ==
 
== Fall 3: Die IDE findet eine Unit, aber der Compiler nicht ==
  
Dies ist der Fall, wenn Find Declaration die Unit findet, aber das Erstellen (Ctrl+F9) fehlschlägt.
+
Dies ist der Fall, wenn 'Find Declaration' die Unit findet, aber das Erstellen (Strg+F9) fehlschlägt.
  
 
Es gibt zwei Möglichkeiten:
 
Es gibt zwei Möglichkeiten:
 
Entweder findet der Compiler gar nichts, oder ihm gefällt nicht, was er findet. In beiden Fällen gibt er die selbe Fehlermeldung aus: unit xyz not found.
 
Entweder findet der Compiler gar nichts, oder ihm gefällt nicht, was er findet. In beiden Fällen gibt er die selbe Fehlermeldung aus: unit xyz not found.
 +
 +
Sie können nachschauen, wo der Compiler sucht und was er findet durch Hinzufügen der -vu -vt Optionen (Kurzform: -vut). '''Vorsicht''': Dies ergibt leicht tausende Zeilen an Ausgaben.
 +
Das -vut muss bei dem Schritt angewendet werden, der den Fehler verursacht. Wenn es während der Kompilierung Ihres Projekts passiert, aktivieren Sie -vt in den Compilereinstellungen des Projekts. Wenn es während der Erstellung eines Packages passiert, verwenden Sie die Compilereinstellungen des Packages. Wenn es während der Erstellung der IDE passiert, nutzen Sie das Werkzeug -> "Lazarus erstellen" einrichten -> Erweiterte Build-Optionen -> Einstellungen.
 +
Dann kompilieren Sie erneut. Es wird die Kompilierung verlangsamen.
 +
Dann klicken Sie mit der rechten Maustaste auf das Nachrichtenfenster und wählen 'Alle und versteckte Meldungen in die Zwischenablage kopieren'. Dann fügen Sie es in den Quelltexteditor ein. Nun suchen Sie nach allen Stellen, wo der Unitname erwähnt wird.
  
 
=== Fall 3.1: Der Compiler findet die .ppu Datei, aber er mag sie nicht ===
 
=== Fall 3.1: Der Compiler findet die .ppu Datei, aber er mag sie nicht ===
  
Dies kann passieren, wenn die gefundene .ppu Datei älter ist als die benötigte Unit (.pas, .pp oder .ppu). Zum Beispiel wenn Unit1 die Unit2 verwendet und Unit2 geändert wurde, dann muß auch Unit1 rekompiliert werden.
+
Dies kann passieren, wenn die gefundene .ppu Datei älter ist als die benötigte Unit (.pas, .pp oder .ppu). Zum Beispiel wenn Unit1 die Unit2 verwendet und Unit2 geändert wurde, dann muss auch Unit1 rekompiliert werden.
 +
 
 +
Es kann auch passieren, wenn Sie neuere Dateien installiert haben, ohne die alten zu löschen. Der Compiler stoppt an der ersten Fundstelle.
 +
 
 +
Sie können nachschauen, was der Compiler findet und was fehlt mit dem -vt Kommandozeilenschalter. Aber dies erzeugt eine Menge Ausgaben und ist für Anfänger schwer zu lesen.
 +
 
 +
Der einfachste Weg ist oft, die Packages und das Projekt zuerst mit der 'clean' Option (Alles neu erstellen) zu rekompilieren. Im Fall der Lazarus Quellen selbst: Der ' "Lazarus erstellen" einrichten' Dialog hat einen Button, um alle Einstellungen für eine saubere Erstellung (clean build) einzurichten.
 +
 
 +
=== Fall 3.2: Der Compiler findet weder Quell- (.pas, .pp) noch .ppu-Datei ===
 +
 
 +
In diesem Fall müssen Sie den Suchpfad erweitern. Die Frage ist: Soll das .ppu Verzeichnis oder das Quellverzeichnis hinzugefügt werden?
 +
 
 +
{{Warning|Wenn Sie den falschen Suchpfad hinzufügen kann es passieren, dass der Compiler mehrfache Kopien der Dateien erzeugt und Sie später den 'unit not found' Fehler von Fall 3.1 erhalten.}}
 +
 
 +
Viele Projekte und Packages haben getrennte Quellverzeichnisse (.pas, .pp) und Ausgabeverzeichnisse (.ppu). Wenn ein Package ein Ausgabeverzeichnis hat, dann sollte nur dieses Verzeichnis zum Suchpfad der abhängigen Projekte und/oder Packages hinzugefügt werden. Die IDE macht dies automatisch. Zum Beispiel: Das Hinzufügen der LCL als Abhängigkeit zu Ihrem Projekt fügt zwei Ausgabeverzeichnisse zu Ihrem Unit-Suchpfad hinzu. Sie können dies nachschauen unter Compilereinstellungen -> Übernehmen. Fügen Sie niemals ein anderes LCL Verzeichnis zu Ihren Suchpfaden hinzu oder Sie werden die Fall 3.1 Fehler erhalten.
 +
 
 +
* '''Prüfen Sie, ob die Unit im Compiler-Suchpfad ist''': Der Suchpfad wird dem Compiler mit den -Fu Optionen der Kommandozeilenparameter übergeben. Sie können die dem Compiler übergebenen Optionen nachschauen in Compilereinstellungen -> Einstellungen anzeigen.
 +
 
 +
=== Fall 3.3: Der falsche Compiler wird verwendet ===
  
It can also happen, if you installed newer files without deleting the old ones. The compiler stops at the first found.
+
Perhaps when cross compiling the correct cross .ppu is found, but the wrong compiler is used.
  
You can see, what the compiler finds and what is missing by giving the -vt command line switch. But this gives a lot of output and it is hard to read for newbies.
+
Starten Sie Lazarus aus einer Textkonsole (mit startlazarus), damit Sie die Debug-Ausgaben sehen können und die während der Kompilierung erzeugten Ausgaben.
  
The easiest way is often to first recompile the packages and project clean (Build all). In case of the Lazarus sources itself: The configure build lazarus dialog has a button to setup all options for a clean build.
+
Die Ausgaben könnten wie folgt aussehen:
 +
TPkgManager.GetWritablePkgOutputDirectory APackage=DBFLaz 0.1.1 AnOutDirectory="/home/sam/.lazarus/lib/DBFLaz/powerpc-linux"
 +
TLazPackageGraph.CheckIfPackageNeedsCompilation  No state file for JPEGForLazarus 1.0.1
 +
[TExternalToolList.Run] CmdLine="/usr/bin/ppc386  -S2cgi -OG1 -Ppowerpc -gl -vewnhi -l -Fu../../lcl/units/powerpc-linux/ -Fu../../lcl/units/powerpc-linux/gtk2/ -Fu../../packager/units/powerpc-linux/ -Fu. -FU/home/sam/.lazarus/lib/JPEGForLazarus/powerpc-linux/ -dLCL -dLCLgtk2 jpegforlazarus.pas" 
 +
WorkDir="/usr/share/lazarus/components/jpeg/"
 +
Hint: Start of reading config file /etc/fpc.cfg
 +
Hint: End of reading config file /etc/fpc.cfg
 +
Warning: You are using the obsolete switch -OG
 +
Free Pascal Compiler version 2.3.1 [2007/12/10] for i386
 +
Copyright (c) 1993-2007 by Florian Klaempfl
 +
Target OS: Linux for i386
 +
Compiling jpegforlazarus.pas
 +
Compiling lazjpeg.pas
 +
PPU Loading /usr/share/lazarus/lcl/units/powerpc-linux/intfgraphics.ppu
 +
PPU is compiled for another processor
 +
Fatal: Can't find unit IntfGraphics used by LazJPEG
 +
GetMsgLineFilename Filename "lazjpeg.pas" not found.
 +
TExternalToolList.Run Exception: /usr/share/lazarus/components/jpeg/lazjpeg.pas(1,1) Fatal: Can't find unit IntfGraphics used by LazJPEG
  
=== Fall 3.2: Der Compiler findet weder Quell- (.pas, .pp) noch .ppu Datei ===
+
The clues are these lines:
  
In diesem Fall müssen sie den Suchpfad erweitern. Die Frage ist: Soll das .ppu Verzeichnis oder das Quellverzeichnis hinzugefügt werden?
+
[TExternalToolList.Run] CmdLine="/usr/bin/ppc386  -S2cgi -OG1 -Ppowerpc -gl -vewnhi -l -Fu../../lcl/units/powerpc-linux/ -Fu../../lcl/units/powerpc-linux/gtk2/ -Fu../../packager/units/powerpc-linux/ -Fu. -FU/home/sam/.lazarus/lib/JPEGForLazarus/powerpc-linux/ -dLCL -dLCLgtk2 jpegforlazarus.pas" 
 +
...
 +
Target OS: Linux for i386
 +
...
 +
PPU Loading /usr/share/lazarus/lcl/units/powerpc-linux/intfgraphics.ppu
 +
PPU is compiled for another processor
  
'''WARNUNG''': Wenn sie den falschen Suchpfad hinzufügen kann es passieren, daß der Compiler mehrfache Kopien der Dateien erzeugt und sie später den 'unit not found' Fehler von Fall 3.1 erhalten.
+
Although a different CPU or OS is selected as a compile target and the ppu is found, maybe lazarus for mysterious and unexplained reasons of it's own is just calling the wrong compiler.
  
Many projects and packages have distinct source directories (.pas, .pp) and output directories (.ppu). If a package has an output directory, then only this directory should be added to the search path of any depending project and/or package. The IDE will do this automatically. For example: Adding the LCL as dependency to your project adds two output directories to your unit search path. You can see this in Compiler Options -> Inherited. Never add any other LCL directory to your search paths or you will get Case 3.1 errors.
+
An answer is still being sought, but with these instructions you can at least tell if this is the case for you.
  
* '''Prüfen sie, ob die Unit im Compiler-Suchpfad ist''': Der Suchpfad wird dem Compiler mit den -Fu Optionen der Kommandozeilenparameter übergeben. You can see the options given to the compiler in Compiler Options -> Show Options.
+
Lazarus verwendet den in den Umgebungseinstellungen eingestellten Compiler. Es passiert leicht, dass man vergisst, den Compiler zu ändern, wenn man die Ziel-CPU ändert. Therefore it is recommended to set the compiler in the environment options to the fpc executable, which is a front end to the ppcXXX compiler backends. The fpc executable chooses the right ppcXXX compiler based on the -P parameter or the native pccXXX compiler if no such parameter is given. The drawback of using fpc instead of for example ppc386 directly, is that an extra process needs to be started (one for fpc and one for ppcXXX) which slows down compilation slightly, but this is hardly measurable.

Latest revision as of 00:42, 5 January 2015

Deutsch (de) English (en) français (fr) magyar (hu)

Überblick

Diese Seite handelt von einem der bedeutendsten Fehler in Pascal: unit not found bzw. can't find unit. Dieser Fehler kann eine Menge von Ursachen haben. Diese Seite versucht die meisten von ihnen zu erfassen, weiterhin wie man sie herausfindet, um welches Problem es sich handelt und wie man eine Lösung dafür findet.

Es gibt ein Werkzeug, um auf viele übliche Fehlkonfigurationen zu prüfen: Projekt -> Compilereinstellungen ... -> Test. Starten Sie es und sehen Sie sich die erstellten Warnungen an. Normalerweise sollte es vor einigen doppelten ppu-Dateien in den FPC-Quellen warnen (die Dateien hängen von der FPC Version und der Distribution ab).

Quicklist

Für Experten ist hier eine Liste möglicher Gründe für den Fehler. Diese Liste ist nicht nach Wahrscheinlichkeit sortiert.

  • FPC Installation
    • Sie haben eine Ihrer Units wie eine FPC Unit benannt.
    • Falsche fpc.cfg. $HOME/.fpc.cfg anstelle von /etc/fpc.cfg. Herauszufinden mit -vut.
    • Fehlender oder falscher Suchpfad in der fpc.cfg. Herauszufinden mit -vut.
    • Cross compiling: Forgot to install the cross compiled FPC ppus. Herauszufinden mit -vut.
    • Zerschossene FPC Installation. Entfernen Sie das FPC Verzeichnis manuell und installieren Sie FPC erneut.
    • Compiler symlink zeigt auf den falschen Compiler.
    • FPCDIR Umgebungsvariable ist falsch gesetzt
  • Lazarus
    • Falsche Schreibweise. Wenn der Dateiname einer Unit Buchstaben in Groß- und Kleinschreibweise enthält, müssen auch sämtliche uses-Klauseln die richtige Schreibweise verwenden. Vor Version 0.9.29 suchte die IDE nicht 'in' Dateinamen nach Klein- und Großschreibweise. Überprüfen Sie die Dateinamen in den uses-Abschnitten.
    • Falsche Unit: Wenn es zwei Units mit dem selben Dateinamen im Suchpfad gibt, könnte der Compiler ohne Warnhinweis die falsche Unit verwendet haben. Normalerweise warnt die IDE, aber das ist in Einstellungen -> Umgebungseinstellungen -> Namensvergabe -> Mehrdeutige Dateiaktion vielleicht deaktiviert.
    • Vergessen, die FPC-Quelltexte zu installieren und/ oder vergessen, den Pfad zu setzen in Einstellungen -> Umgebungseinstellungen -> Dateien -> FPC-Quelltextverzeichnis.
    • Verwendung der falschen Version der FPC Quellen
    • Verwendung des falschen Compilers. Prüfen Sie Einstellungen -> Umgebungseinstellungen -> Dateien -> Compilerdateiname.
    • Verwendung des falschen Lazarus Verzeichnisses. Prüfen Sie Einstellungen -> Umgebungseinstellungen -> Dateien -> Lazarus-Verzeichnis.
    • Forgot to add a package dependency. Check project inspector or package editor.
    • Added a search path to your own units to fpc.cfg instead of creating a package.
    • Falsch geschriebene oder fehlende Suchpfade. Check project / compiler options, pages Paths and Inherited and check source editor / popup menu / file settings / unit info / unit paths.
    • Cross compiling: Forgot to cross compile lcl, synedit for the new platform. Diese werden nicht automatisch kompiliert.
    • Eine ppu Datei existiert zweifach. Herauszufinden mit -vut. Entfernen Sie die falsche ppu Datei. Check if two packages or a package and the project contain the same unit search path in their compiler options.

Schreibweisen und Ausdrücke

  • .pas Datei: Dies ist ein Platzhalter für jede Pascal-Unit-Quelldatei. Zum Beispiel unit1.pas oder unit1.pp. Beide Erweiterungen sind erlaubt und zwischen ihnen gibt es keine Unterschiede. Es gibt andere Compiler, die .pp Dateien ignorieren, aber diese Seite behandelt den Free Pascal Compiler.
  • .pp Datei: Das selbe wie .pas. Nur eine andere Erweiterung für die selbe Sache.
  • .p Datei: Das selbe wie .pas. Nur eine andere Erweiterung für die selbe Sache. Üblicherweise genutzt auf Macintosh.
  • .ppu Datei: Dies ist ein Platzhalter für jede kompilierte Pascal-Unit, die vom Free Pascal Compiler erzeugt wurde.

Schritt 1: Compiler oder IDE oder beide

Die IDE und der Compiler verwenden nicht exakt die selben Wege um Units zu lokalisieren.

Compiler

Wenn der Compiler sie nicht finden kann, schlägt die Kompilierung fehl (Erstellen, Strg+F9) mit der Fehlermeldung 'unit not found'.

IDE

Wenn die IDE sie nicht finden kann, werden die CodeTools fehlschlagen. Zum Beispiel Find Declaration (Alt+Up oder Strg+Linke Maustaste) oder Bezeichnervervollständigung (Strg+Space) werden mit der Fehlermeldung 'unit not found' fehlschlagen. If the error message is about units you don't use directly, then simply add the unit name to a uses section and do a find declaration. After that you can remove it.

Suchstrategien

Was beide suchen

  • Beide suchen Units in den Suchpfaden.
  • Beide suchen zuerst nach Pascal-Quelldateien (.pas, .pp). Im MacPAS Modus wird auch nach .p Dateien gesucht.
  • Beide suchen nach verschiedenen Schreibweisen: normal, kleingeschrieben, großgeschrieben. Zum Beispiel: wenn der uses Abschnitt 'Unit1' enthält, dann suchen sie nach:
 1. Unit1.pp
 2. unit1.pp
 3. UNIT1.PP
 4. Unit1.pas
 5. unit1.pas
 6. UNIT1.PAS

Sie werden in jedem Verzeichnis des Suchpfades gesucht.

Unterschiede zwischen IDE und FPC Unit-Suche

  • FPC verwendet die fpc.cfg Datei für zusätzliche Suchpfade. Die IDE verwendet sie nur, um Dateien der FPC Quellen zu finden. Daher wird das Hinzufügen von Suchpfaden zu fpc.cfg von Lazarus ignoriert.
  • FPC always starts in one directory and every relative filename is relative to this directory. Für die Lazarus IDE hat jedes Projekt und jedes Package sein eigenes Basisverzeichnis. Daher ist der Suchpfad eines Packages relativ zum Package-Verzeichnis. Das Package-Verzeichnis ist das Verzeichnis der .lpk Datei. Das Basisverzeichnis eines Projekts ist das Verzeichnis der Projekt-Hauptquelldatei (z.B. die .lpr Datei). Wenn es keine Hauptquelldatei gibt, wird das Verzeichnis der .lpi Datei genommen. Normalerweise sind beide identisch und die IDE has no graphical frontend to split. But by editing the .lpi file manually you can split them. Im Moment gibt es nur ein prominentes Beispiel für diesen Fall: die ppxxx.lpi Dateien des Free Pascal Compilers.
  • FPC und Lazarus haben unterschiedliche Makros.
  • Sie können zusätzliche Quellensuchpfade definieren, die nicht an den Compiler übergeben werden. (Compilereinstellungen -> Andere Quellen)

Fall 1: Beide können die Unit nicht finden

  • Prüfen Sie, ob die Unit existiert: Wenn nicht, then see chapter Searching packages, projects of a unit (ToDo: write me).
  • Prüfen Sie, ob die Unit lesbar ist: (Sie können sie in der IDE öffnen.) (Eine Unit Quelldatei benötigt keine Schreibrechte.) Wenn nicht, dann korrigieren Sie die Berechtigungen oder besorgen Sie sich eine lesbare Kopie.
  • Prüfen Sie, ob die Unit einen gültigen Pascal-Namen hat: (Bezeichner plus Erweiterung). Gültige Beispiele: unit1.pas, Bogus2.pp, _1.pas, LAZ.PAS. Ungültige Beispiele: 1.pas (beginnt mit einer Ziffer), a%.pas (enthält spezielles Zeichen), unit.PAS (Erweiterung großgeschrieben aber Dateiname kleingeschrieben).
  • Prüfen Sie, ob der Verzeichnisname spezielle Zeichen enthält
  1. Slash / und Backslash \ werden als Verzeichnis-Begrenzungszeichen verwendet und sollten niemals für Verzeichnisnamen verwendet werden.
  2. Semikolons werden in der IDE verwendet um Pfade zu trennen.
  3. Dollar $ wird in vielen Skriptsprachen für Makros verwendet.
  • Prüfen Sie die richtige Schreibweise: Wenn Ihr Unitname komplett kleingeschrieben oder komplett großgeschrieben ist, müssen Sie sich keine Sorgen machen. Falls nicht, müssen Sie sicherstellen, dass jeder uses Abschnitt in jedem Quelltext exakt diese Schreibweise verwendet. Zum Beispiel: falls ihre Unit Unit1.pas heißt, dann muss jeder uses-Abschnitt Unit1 verwenden. Dies ist nicht so wichtig unter Windows, aber unter jeder anderen Plattform (Linux, MacOSX). Die IDE gibt Warnmeldungen aus, wenn Sie Dateien mit gemischter Schreibweise speichern wollen.
  • Prüfen Sie, ob die Unit im Suchpfad ist. Wenn die Kompilierung während des Kompilieren eines Packages stoppt, schauen Sie in den Compilereinstellungen dieses Packages nach (öffnen Sie das Package, dort gibt es einen Button 'Compilereinstellungen'). Wenn die Kompilierung während des Kompilierens eines Projekts stoppt, dann schauen Sie unter Projekt -> Compilereinstellungen nach.

Fall 2: Der Compiler findet eine Unit, aber die IDE nicht

Der nächste Fall setzt voraus, dass Start -> Erstellen (Strg+F9) in der Lazarus IDE funktioniert, aber 'Find Declaration' mit der Fehlermeldung: 'unit not found' fehlschlägt. Wenn Sie unsicher sind, prüfen Sie auch Fall 1.

  • Prüfen Sie, ob der Unit-Quelltext existiert: Die IDE sucht nach Pascal Quellen (.pas, .pp) und ignoriert die .ppu Dateien. Der Compiler kann eine .ppu Datei verwenden, aber die Lazarus IDE nicht. Dieses Feature ist geplant, aber es gibt noch keinen Zeitrahmen.
  • Prüfen Sie, ob der Unit-Pfad zu ihrer fpc.cfg hinzugefügt wurde: Der Compiler benutzt alle Pfade, die in der fpc.cfg Datei definiert sind. Die IDE liest diese Datei nicht. Fügen Sie den Suchpfad zu den Compilereinstellungen Ihres Projekts und/oder Packages hinzu.
  • Check for macros and special compiler flags: Der Compiler versteht das Stern- * zeichen in den Suchpfaden. Die IDE behandelt dieses Zeichen als normales Zeichen. You can add the -Fu, -FU, -FE flags manually to the custom compiler flags in the lazarus IDE, but they are not parsed. Always use the right fields for options. The custom options are only for flags like the -D flag or uncommon compiler options, like new features of the unstable developer compiler.

Fall 3: Die IDE findet eine Unit, aber der Compiler nicht

Dies ist der Fall, wenn 'Find Declaration' die Unit findet, aber das Erstellen (Strg+F9) fehlschlägt.

Es gibt zwei Möglichkeiten: Entweder findet der Compiler gar nichts, oder ihm gefällt nicht, was er findet. In beiden Fällen gibt er die selbe Fehlermeldung aus: unit xyz not found.

Sie können nachschauen, wo der Compiler sucht und was er findet durch Hinzufügen der -vu -vt Optionen (Kurzform: -vut). Vorsicht: Dies ergibt leicht tausende Zeilen an Ausgaben. Das -vut muss bei dem Schritt angewendet werden, der den Fehler verursacht. Wenn es während der Kompilierung Ihres Projekts passiert, aktivieren Sie -vt in den Compilereinstellungen des Projekts. Wenn es während der Erstellung eines Packages passiert, verwenden Sie die Compilereinstellungen des Packages. Wenn es während der Erstellung der IDE passiert, nutzen Sie das Werkzeug -> "Lazarus erstellen" einrichten -> Erweiterte Build-Optionen -> Einstellungen. Dann kompilieren Sie erneut. Es wird die Kompilierung verlangsamen. Dann klicken Sie mit der rechten Maustaste auf das Nachrichtenfenster und wählen 'Alle und versteckte Meldungen in die Zwischenablage kopieren'. Dann fügen Sie es in den Quelltexteditor ein. Nun suchen Sie nach allen Stellen, wo der Unitname erwähnt wird.

Fall 3.1: Der Compiler findet die .ppu Datei, aber er mag sie nicht

Dies kann passieren, wenn die gefundene .ppu Datei älter ist als die benötigte Unit (.pas, .pp oder .ppu). Zum Beispiel wenn Unit1 die Unit2 verwendet und Unit2 geändert wurde, dann muss auch Unit1 rekompiliert werden.

Es kann auch passieren, wenn Sie neuere Dateien installiert haben, ohne die alten zu löschen. Der Compiler stoppt an der ersten Fundstelle.

Sie können nachschauen, was der Compiler findet und was fehlt mit dem -vt Kommandozeilenschalter. Aber dies erzeugt eine Menge Ausgaben und ist für Anfänger schwer zu lesen.

Der einfachste Weg ist oft, die Packages und das Projekt zuerst mit der 'clean' Option (Alles neu erstellen) zu rekompilieren. Im Fall der Lazarus Quellen selbst: Der ' "Lazarus erstellen" einrichten' Dialog hat einen Button, um alle Einstellungen für eine saubere Erstellung (clean build) einzurichten.

Fall 3.2: Der Compiler findet weder Quell- (.pas, .pp) noch .ppu-Datei

In diesem Fall müssen Sie den Suchpfad erweitern. Die Frage ist: Soll das .ppu Verzeichnis oder das Quellverzeichnis hinzugefügt werden?

Warning-icon.png

Warnung: Wenn Sie den falschen Suchpfad hinzufügen kann es passieren, dass der Compiler mehrfache Kopien der Dateien erzeugt und Sie später den 'unit not found' Fehler von Fall 3.1 erhalten.

Viele Projekte und Packages haben getrennte Quellverzeichnisse (.pas, .pp) und Ausgabeverzeichnisse (.ppu). Wenn ein Package ein Ausgabeverzeichnis hat, dann sollte nur dieses Verzeichnis zum Suchpfad der abhängigen Projekte und/oder Packages hinzugefügt werden. Die IDE macht dies automatisch. Zum Beispiel: Das Hinzufügen der LCL als Abhängigkeit zu Ihrem Projekt fügt zwei Ausgabeverzeichnisse zu Ihrem Unit-Suchpfad hinzu. Sie können dies nachschauen unter Compilereinstellungen -> Übernehmen. Fügen Sie niemals ein anderes LCL Verzeichnis zu Ihren Suchpfaden hinzu oder Sie werden die Fall 3.1 Fehler erhalten.

  • Prüfen Sie, ob die Unit im Compiler-Suchpfad ist: Der Suchpfad wird dem Compiler mit den -Fu Optionen der Kommandozeilenparameter übergeben. Sie können die dem Compiler übergebenen Optionen nachschauen in Compilereinstellungen -> Einstellungen anzeigen.

Fall 3.3: Der falsche Compiler wird verwendet

Perhaps when cross compiling the correct cross .ppu is found, but the wrong compiler is used.

Starten Sie Lazarus aus einer Textkonsole (mit startlazarus), damit Sie die Debug-Ausgaben sehen können und die während der Kompilierung erzeugten Ausgaben.

Die Ausgaben könnten wie folgt aussehen:

TPkgManager.GetWritablePkgOutputDirectory APackage=DBFLaz 0.1.1 AnOutDirectory="/home/sam/.lazarus/lib/DBFLaz/powerpc-linux"
TLazPackageGraph.CheckIfPackageNeedsCompilation  No state file for JPEGForLazarus 1.0.1
[TExternalToolList.Run] CmdLine="/usr/bin/ppc386  -S2cgi -OG1 -Ppowerpc -gl -vewnhi -l -Fu../../lcl/units/powerpc-linux/ -Fu../../lcl/units/powerpc-linux/gtk2/ -Fu../../packager/units/powerpc-linux/ -Fu. -FU/home/sam/.lazarus/lib/JPEGForLazarus/powerpc-linux/ -dLCL -dLCLgtk2 jpegforlazarus.pas"   
WorkDir="/usr/share/lazarus/components/jpeg/"
Hint: Start of reading config file /etc/fpc.cfg
Hint: End of reading config file /etc/fpc.cfg
Warning: You are using the obsolete switch -OG
Free Pascal Compiler version 2.3.1 [2007/12/10] for i386
Copyright (c) 1993-2007 by Florian Klaempfl
Target OS: Linux for i386
Compiling jpegforlazarus.pas
Compiling lazjpeg.pas
PPU Loading /usr/share/lazarus/lcl/units/powerpc-linux/intfgraphics.ppu
PPU is compiled for another processor
Fatal: Can't find unit IntfGraphics used by LazJPEG
GetMsgLineFilename Filename "lazjpeg.pas" not found.
TExternalToolList.Run Exception: /usr/share/lazarus/components/jpeg/lazjpeg.pas(1,1) Fatal: Can't find unit IntfGraphics used by LazJPEG 

The clues are these lines:

[TExternalToolList.Run] CmdLine="/usr/bin/ppc386  -S2cgi -OG1 -Ppowerpc -gl -vewnhi -l -Fu../../lcl/units/powerpc-linux/ -Fu../../lcl/units/powerpc-linux/gtk2/ -Fu../../packager/units/powerpc-linux/ -Fu. -FU/home/sam/.lazarus/lib/JPEGForLazarus/powerpc-linux/ -dLCL -dLCLgtk2 jpegforlazarus.pas"   
...
Target OS: Linux for i386
...
PPU Loading /usr/share/lazarus/lcl/units/powerpc-linux/intfgraphics.ppu
PPU is compiled for another processor

Although a different CPU or OS is selected as a compile target and the ppu is found, maybe lazarus for mysterious and unexplained reasons of it's own is just calling the wrong compiler.

An answer is still being sought, but with these instructions you can at least tell if this is the case for you.

Lazarus verwendet den in den Umgebungseinstellungen eingestellten Compiler. Es passiert leicht, dass man vergisst, den Compiler zu ändern, wenn man die Ziel-CPU ändert. Therefore it is recommended to set the compiler in the environment options to the fpc executable, which is a front end to the ppcXXX compiler backends. The fpc executable chooses the right ppcXXX compiler based on the -P parameter or the native pccXXX compiler if no such parameter is given. The drawback of using fpc instead of for example ppc386 directly, is that an extra process needs to be started (one for fpc and one for ppcXXX) which slows down compilation slightly, but this is hardly measurable.