Unit not found - How to find units/de

From Lazarus wiki
Revision as of 13:06, 5 December 2006 by Swen (talk | contribs)
Jump to navigationJump to search

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

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

Der erste Schritt besteht darin herauszufinden, ob die IDE die Unit nicht finden kann oder der Compiler sie nicht finden kann oder beides.

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. Wenn der Compiler sie nicht finden kann, schlägt die Kompilierung fehl (Erstellen, Ctrl+F9) mit der Fehlermeldung 'unit not found'. Wenn die IDE sie nicht finden kann, werden die code tools fehlschlagen. Zum Beispiel Find Declaration (Alt+Up oder Ctrl+Linke Maustaste) oder Identifier completion (Ctrl+Space) werden mit der selben Fehlermeldung 'unit not found' fehlschlagen.

Gemeinsamkeiten:

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

  • 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 und Lazarus haben unterschiedliche Makros.
  • Sie können zusätzliche Quellensuchpfade definieren, welche 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 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. Dollar $ wird in vielen Skriptsprachen für Makros verwendet
  • 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, ob die Unit im Suchpfad ist. ToDo: write me

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. 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. Add the search path to the compiler options of your projects and/or packages.
  • 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.

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.

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.

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.

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

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.

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.

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?

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.

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: 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. 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. You can see the options given to the compiler in Compiler Options -> Show Options.