fehlende Unit in FPC 3.0.4

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
docgmb
Beiträge: 2
Registriert: Mi 27. Okt 2021, 22:05

fehlende Unit in FPC 3.0.4

Beitrag von docgmb »

Kurze Erklärung vorweg: Ich schreibe meine Programme auf einem Linux-Rechner mit Kate und compiliere sie mit FPC 3.0.4 direkt auf Kommandozeilenebene. Ich nutze also Lazarus nicht - das hat aber keinen Einfluss auf das hier berichtete Problem.

Ich möchte in einem Programm, das eMails aus Outlook-Archivdateien einliest, eine Konvertierung von Mail-Texten, die in Windows 1252 codiert sind, nach UTF-8 durchführen. Dafür gibt es die String-Konvertierungsfunktion CP1252ToUTF8, die mit dem Unit LConvEncoding zur Verfügung gestellt wird. Wenn ich dieses Unit allerdings einbinde, wirft der Compiler die fatale Fehlermeldung aus: Unit nicht gefunden. Längere Forensuche brachte mir zwei Erkenntnisse:
1) FPC 3.0.4 enthält normalerweise dieses Unit.
2) Es könnte ein Problem mit den symbolischen Links zu FPC geben.
Ersteres ist nicht gesichert, mein Stöbern in den Installationspaketen erbrachte keine Klarheit. Letzteres habe ich überprüft, der Ort, wo Ubuntu den Compiler samt Units im Datenbaum ablegt ist offenbar etwas neben der Norm, aber alles ist super verlinkt.

So sieht das winzige Testprogramm aus, das ich zur Fehlersuche auf das Nötigste eingedampft habe:

Code: Alles auswählen

Program conv; 
{$MODE OBJFPC}{$H+}
uses 
    LConvEncoding, SysUtils, StrUtils, Crt;
var
    Datei: Text;
    Ort, Zeile: UniCodeString;
    rs: RawByteString;
begin
    ClrScr();
    Ort:='/home/max/Mails/Archivordner/2005';
    Assign(Datei, Ort + '/409');
    Reset(Datei);
    while not eof(Datei) do 
        begin
            ReadLn (Datei, rs);
            SetCodePage(rs, 1252, false);
            Zeile:=CP1252toUTF8(rs);
            Writeln(Zeile);
        end;
end. 
Mir ist klar, dass ich archaisch programmiere (habe 40 Jahren mit Fortran80 angefangen, später viel mit TurboPascal 3.0 für DOS programmiert und dann ganz damit aufgehört). Aber das tut hier nichts zur Sache. Meine Frage ist nur, warum sagt der Compiler:

Code: Alles auswählen

conv.pas(4,5) Fatal: Can't find unit LConvEncoding used by conv
Fatal: Compilation aborted
Error: /usr/bin/ppcx64 returned an error exitcode
?

Wo ist das Problem?

Hardware: Mac Mini (6.2 von 2012 mit 4 × Intel Core i5-2415M CPU@2.30GHz)
System: Kubuntu 20.04.2 LTS. Kein anderes Betriebssystem installiert.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1432
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: fehlende Unit in FPC 3.0.4

Beitrag von fliegermichl »

Der Compiler sucht die Datei dreimal:
lconvencoding.pp lconvencoding.pas
LCONVENCODING.PP LCCONVENCODING.PAS
LConvEncoding.pp LConvEncoding.pas

Wenn er sie so nicht finden kann, gibt er auf.
Als nächstes gibt es meines Wissens den Typ "Text" so nicht mehr. Das ist jetzt "TextFile".
Genauso "Assign" heisst jetzt "AssignFile".

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: fehlende Unit in FPC 3.0.4

Beitrag von af0815 »

Das mit neben der Norm muss man von 2 Seiten sehen. Die Pakete der Distros sind für den FPC auch neben der Norm. Vor allen Dingen ist es auch Distro verschieden, wo etwas hingelegt werden sollte. Das ist aber schon lang und breit im englischen Forum auch mit Paketverantwortlichen diskutiert worden.

Bei dir ist es einmal so,, du solltest suchen wo die vermisste Datei ist einmal als Source und einmal als ppu. Dann Kontrolliere welche fpc.cfg verwendet wird und ob dort die Pfade stimmen. Siehe u.a. https://www.freepascal.org/docs-html/user/usersu10.html und https://wiki.lazarus.freepascal.org/Configuration_file

-----
Einen aktuellen fpc (3.2.2) kann man sich Linuxmässig direkt von der Homepage herunterladen https://www.freepascal.org/download.html . Bei diesen Downloads ist das originale Layout intakt und man kann sich immer den aktuellen laden. Ebenso mittels GIT sich die aktuellen Sourcen holen. Auch fpcup ist eine Möglichkeit.


Edit: Auch hier ging es um fehlende Units viewtopic.php?t=13123 , viewtopic.php?t=6301
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

PascalDragon
Beiträge: 825
Registriert: Mi 3. Jun 2020, 07:18
OS, Lazarus, FPC: L 2.0.8, FPC Trunk, OS Win/Linux
CPU-Target: Aarch64 bis Z80 ;)
Wohnort: München

Re: fehlende Unit in FPC 3.0.4

Beitrag von PascalDragon »

docgmb hat geschrieben:
Mi 27. Okt 2021, 22:49
Kurze Erklärung vorweg: Ich schreibe meine Programme auf einem Linux-Rechner mit Kate und compiliere sie mit FPC 3.0.4 direkt auf Kommandozeilenebene. Ich nutze also Lazarus nicht - das hat aber keinen Einfluss auf das hier berichtete Problem.
Doch, hat es, da die Unit LConvEncoding bei Lazarus dabei ist und nicht bei FPC. ;)
fliegermichl hat geschrieben:
Do 28. Okt 2021, 07:01
Der Compiler sucht die Datei dreimal:
lconvencoding.pp lconvencoding.pas
LCONVENCODING.PP LCCONVENCODING.PAS
LConvEncoding.pp LConvEncoding.pas
Erstens ist das sechsmal und zweitens sucht er zumindest für die Mac Ziele (macOS und Classic) auch noch nach .p ;)
fliegermichl hat geschrieben:
Do 28. Okt 2021, 07:01
Als nächstes gibt es meines Wissens den Typ "Text" so nicht mehr. Das ist jetzt "TextFile".
Genauso "Assign" heisst jetzt "AssignFile".
Falsch. Sowohl Text als auch Assign existieren nach wie vor. Es ist nur so, dass bei Verwendung der Modi ObjFPC oder Delphi Aliase deklariert werden, damit eine Verwirrung mit TPersistent.Assign und SomeControl.Text vermieden wird.
FPC Compiler Entwickler

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1432
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: fehlende Unit in FPC 3.0.4

Beitrag von fliegermichl »

Ah ok, wieder was gelernt. Danke!

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: fehlende Unit in FPC 3.0.4

Beitrag von wp_xyz »

docgmb hat geschrieben:
Mi 27. Okt 2021, 22:49
Meine Frage ist nur, warum sagt der Compiler:

Code: Alles auswählen

conv.pas(4,5) Fatal: Can't find unit LConvEncoding used by conv
Fatal: Compilation aborted
Error: /usr/bin/ppcx64 returned an error exitcode
Wo ist das Problem?
Wie pascaldragon schon sagte, gehört die Unit LConvEncoding nicht zu FPC, sondern zu Lazarus, genauergesagt: zum Package LazUtils. Wenn du mit Lazarus arbeiten würdest, müsstest du dieses Package zu den "Benötigten Packages" der Projekts hinzufügen (das macht man im Projekt-Inspektor), und dir würden alle Units dieses Package, darunter auch LConvEncoding, zur Verfügung stehen. Nachdem du dein Projekt nur mit FPC allein übersetzen willst, musst du den Suchpfad deines Projektes um das Verzeichnis von LazUtils erweitern; das machst du mit dem Kommandozeilenargument -Fu. Bei mir, auf Windows, funktioniert der folgende Aufruf:

Code: Alles auswählen

fpc -FuC:\Lazarus\lazarus-main_fpc-3.2.2\components\lazutils project1.lpr

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: fehlende Unit in FPC 3.0.4

Beitrag von af0815 »

Nur, wenn er die Lazarussourcen bzw. Lazarus nicht installiert hat, dann gibt es den Pfad nicht.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: fehlende Unit in FPC 3.0.4

Beitrag von wp_xyz »

Natürlich. Aber ich meinte gelesen zu haben, er hätte Lazarus installiert - ich kann die Stelle aber gerade nicht mehr finden...

Um auf die ursprüngliche Frage zurückzukommen, die Konvertierung von CP1252 nach UTF8, das kann man auch ohne LConvEncoding machen, allein mit FPC-Bordmitteln:

Code: Alles auswählen

program project1;
type
  CP1252String = type string(1252);
var
  s1252: CP1252String; 
  s: String;
  F: TextFile;
begin
  Assign(F, 'test.txt');    // Die Datei 'test.txt' enthält den String 'äöüÄÖÜß' und ist mit CP1252-Encoding gespeichert.
  Reset(F);
  ReadLn(F, s1252);         // Die Dateizeile wird als CP1252-String eingelesen und steht so in der Variablen s1252.
  s := AnsiToUTF8(s1252);   // Hier erfolgt die Konvertierung CP1252 -> UTF8
  WriteLn(s);
  Close(F);
end.

docgmb
Beiträge: 2
Registriert: Mi 27. Okt 2021, 22:05

Re: fehlende Unit in FPC 3.0.4

Beitrag von docgmb »

Herzlichen Dank an alle Beitragenden! Ich bin wirklich beeindruckt, von der Qualität der Beiträge und der Geschwindigkeit. Da bin ich aus anderen Foren anderes gewöhnt... :) Zu den einzelnen Punkten: Ich habe die Platte absuchen lassen, es gibt keine Datei, die LConvEncoding im Namen trägt. Das dürfte daran liegen, dass ich die Lazarus-Installation total verbockt habe, das Programm läuft nicht und die ganzen zugehörigen Verzeichnisse fehlen. Die guten Tipps zum Einbinden der Units aus den Lazarus-Ressourcen heraus, klappen daher eher nicht.

Aber der Hinweis auf die Funktion AnsiToUTF8 erscheint mir sehr hilfreich! Das wird mein Problem vermutlich lösen.

Und der Hinweis festzustellen, welche Konfigurationsdatei zum Zuge kommt, ist wirklich erhellend.

Code: Alles auswählen

max@max-Macmini:/$ locate fpc.cfg
/etc/fpc.cfg
/etc/alternatives/fpc.cfg
/var/lib/dpkg/alternatives/fpc.cfg
Die drei kommen infrage - das schaue ich mir an.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: fehlende Unit in FPC 3.0.4

Beitrag von af0815 »

docgmb hat geschrieben:
Do 28. Okt 2021, 23:07
Die drei kommen infrage - das schaue ich mir an.
Schau dir den Output von

Code: Alles auswählen

fpc -va
mal an. Da sollten die verwendeten fpc.cfg drinnen auftauchen.
[0.005] Macro defined: REGCALL
[0.005] Reading options from file fpc.cfg
[0.010] Hint: Start of reading config file fpc.cfg
[0.010] interpreting file option "#"
[0.010] interpreting file option "# Config file generated by fpcmkcfg on 13.09.2021 - 14:54:54"
[0.010] interpreting file option "# Example fpc.cfg for Free Pascal Compiler"
[0.010] interpreting file option "#"
[0.011] interpreting file option "# ----------------------"
[0.011] interpreting file option "# Defines (preprocessor)"
[0.011] interpreting file option "# ----------------------"
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten