Unit not found - How to find units/de

From Free Pascal wiki
Jump to: navigation, 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 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.