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

From Lazarus wiki
Jump to navigationJump to search
m
m
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 Gründen 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.
  
 
== Schreibweisen und Ausdrücke ==
 
== Schreibweisen und Ausdrücke ==
Line 17: Line 17:
 
Der erste Schritt besteht darin herauszufinden, ob die IDE die Unit nicht finden kann oder der Compiler sie nicht finden kann oder beides.
 
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.
+
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, Strg+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 Strg+Linke Maustaste) oder ''Identifier completion'' (Strg+Space) werden mit der selben Fehlermeldung 'unit not found' fehlschlagen.
  
 
Gemeinsamkeiten:
 
Gemeinsamkeiten:
Line 52: Line 52:
 
== 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, daß 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.
  
Line 61: Line 61:
 
== 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:

Revision as of 16:22, 18 May 2007

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. 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, Strg+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 Strg+Linke Maustaste) oder Identifier completion (Strg+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. 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, 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: Wenn ihr Unitname komplett kleingeschrieben oder komplett großgeschrieben ist, müssen sie sich keine Sorgen machen. Falls nicht müssen sie sicherstellen, daß jeder uses Abschnitt in jedem Quelltext exakt diese Schreibweise verwendet. Zum Beispiel: falls ihre Unit Unit1.pas heißt, dann muß 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

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

Der nächste Fall setzt voraus, daß 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.

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.

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?

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