Wiki-KopieMirror

Dies ist ein Mirror des Wikis von pascal.chat. Bearbeiten, Verlauf und Anmeldung finden dort statt.

Unit not found - How to find units/de

Deutsch · English · Français · Magyar

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

Schreibweisen und Ausdrücke

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

text
 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

Fall 1: Beide können die Unit nicht finden

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.

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

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:

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

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


From the Free Pascal wiki, page "Unit not found - How to find units/de", as it stood on 2015-01-04 after a change by Socke, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's Licensing page. If you have concerns about this material, message the admin.

Version 2, zuletzt geändert von WikiArchive .