Wie funktioniert h2pas

Für Fragen von Einsteigern und Programmieranfängern...
Warf
Beiträge: 2227
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Wie funktioniert h2pas

Beitrag von Warf »

wennerer hat geschrieben: Sa 1. Nov 2025, 20:39
sudo ln -s -f /lib/x86_64-linux-gnu/libstdc++.so.6.0.33 /usr/bin/libstdc++.so
Hat auch nicht funktioniert (was ich nicht verstehe).
Weil das nach /usr/lib nicht nach /usr/bin muss

Aber eigentlich müsste die C++ toolchain die du installiert hast das ganze mit installieren.

wennerer
Beiträge: 645
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: Wie funktioniert h2pas

Beitrag von wennerer »

Danke für die Info! Aber warum steht dann in der Warnung usr/bin. Leuchtet mir auf Anhieb nicht ein.

Viele Grüße
Bernd

Warf
Beiträge: 2227
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Wie funktioniert h2pas

Beitrag von Warf »

Ah ich sehe wo die Verwirrung herkommt.

Das Problem ist das Folgende, der Compiler baut nicht die Anwendung, er baut jede Unit einzeln in sog. "Object Files" (die .o Dateien) die haben noch referenzen auf Symbole aus anderen Units. Dann werden all die Object Files einem anderen Programm übergeben, dem Linker. Dieser Linker löst dann die Referenzen auf. Der sieht z.B. Unit1.o benutzt die Funktion "Test", die liegt in Unit2.o also verknüpft (linkt) er das zusammen.

Der Linker ist ein Programm das in /usr/bin/ liegt und "ld" heißt. Neben den Object Files kann man dem Linker noch Bibliotheken geben damit er weiß Welche der Symbole in keinem der Object Files liegen sondern zur Laufzeit aus der Bibliothek geladen wird. das geht mit dem Parameter "-l" (l wie library)
Deshalb die Fehlermeldung:
Warning linker: /usr/bin/ld: -lstdc++ kann nicht gefunden werden: Datei oder Verzeichnis nicht gefunden
Das sagt dir das Linker Programm "/usr/bin/ld" (du kannst auch andere Linker benutzen, so gibts z.B. noch gold oder lld) hat den Fehler geworfen das er "-lstc++" nicht nutzen/finden kann. wenn da steht -lXYZ bedeutet das er sucht nach libXYZ.so in /lib, /usr/lib oder im LD_LIBRARY_PATH. Wenn die Datei dort nicht liegt kommt die oben genannte Meldung

wennerer
Beiträge: 645
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: Wie funktioniert h2pas

Beitrag von wennerer »

Ich danke dir recht herzlich für Erklärung!

Viele Grüße
Bernd

Mathias
Beiträge: 7090
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Wie funktioniert h2pas

Beitrag von Mathias »

Code: Alles auswählen

Warning: linker: /usr/bin/ld: -lstdc++ kann nicht gefunden werden: Datei oder Verzeichnis nicht gefunden
Da habe ich mich auch schon zig mal gefragt, wieso dieser Fehler unter Linux kommt. Es wird sogar gemotzt, wen die passende "-dev" fehlt.
Bei Windows wird anstandslos gelinkt, auch wen die passende DLL fehlt. Windows motzt erst, wen man die exe ausführen will, was auch logisch ist.
Anscheinend ist der Linker von Windows intelligenter als der von Linux.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Warf
Beiträge: 2227
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Wie funktioniert h2pas

Beitrag von Warf »

Naja der Linker in Windows kann keinen Fehler werfen, weil der FPC unter Windows keinen Linker verwendet :D
Wie bereits schon gesagt ist das konzept Object Files und Linking etwas das aus dem ELF Format rausfällt. Windows verwendet das nicht. Windows verwendet das PE Format, da sind die Spielregeln nunmal anders. Deshalb baut der FPC nicht wie unter Linux nur Object Files und linkt die dann zusammen, sondern macht alles selbst inklusive dem Linking. Dabei hat der FPC natürlich auch zusätzliche Infos aus dem Pascal code und weiß was wo definiert ist und was fehlt. Diese Info hat der Linux Linker nicht Sprachspezifisch ist kann der nicht wissen was wo definiert ist.

Es gibt zwar Sprachen die auch unter Windows einen Linker verwenden, und Microsoft stellt z.B. für ihren C++ compiler auch einen bereit und der FPC könnte auch darauf zurückgreifen, aber das wichtige ist das bei Windows der nicht Notwendig ist, weil das PE Format ohne externe Linker auskommt. ELF hingegen nicht.
Es ist nunmal eine gänzlich andere Platform mit einem gänzlich anderen System

Mathias
Beiträge: 7090
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Wie funktioniert h2pas

Beitrag von Mathias »

Naja der Linker in Windows kann keinen Fehler werfen, weil der FPC unter Windows keinen Linker verwendet :D
Wie bereits schon gesagt ist das konzept Object Files und Linking etwas das aus dem ELF Format rausfällt. Windows verwendet das nicht. Windows verwendet das PE Format, da sind die Spielregeln nunmal anders. Deshalb baut der FPC nicht wie unter Linux nur Object Files und linkt die dann zusammen, sondern macht alles selbst inklusive dem Linking. Dabei hat der FPC natürlich auch zusätzliche Infos aus dem Pascal code und weiß was wo definiert ist und was fehlt. Diese Info hat der Linux Linker nicht Sprachspezifisch ist kann der nicht wissen was wo definiert ist.
Dann ist der Fall klar, wen fpc unter Linux den externen Linker verwendet und unter Windows alles selbst macht.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1664
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: Wie funktioniert h2pas

Beitrag von corpsman »

Mathias hat geschrieben: Fr 31. Okt 2025, 18:39

Code: Alles auswählen

struct test_struct_t {
    unsigned Field1Bit: 1;
    unsigned Field2Bit: 2;
    unsigned Field6Bit: 6;
}
Die geht, sogar ohne Kopfrechnen.

Code: Alles auswählen

type
  TTestRec = bitpacked record
    Field1Bit: 1 shl 1 - 1;
    Field2Bit: 3 shl 3 -1;
    Field6Bit:6 shl 6 - 1;
  end;
Sry, aber was du da gepostet hast ist nicht richtig, hier mal die Version die auch vom Compiler akzeptiert wird ;)

Code: Alles auswählen


Type
  // Zugriff Bitbassiert
  TBitfield = bitpacked Record
    Field1Bit: 0..(1 Shl 1) - 1;
    Field2Bit: 0..(1 Shl 2) - 1;
    Field5Bit: 0..(1 Shl 5) - 1; // Dein Beispiel hatte hier 6, aber das wären dasn 7-Bit = 2 byte..
  End;

  // Union zum einfachen Konvertieren ;)
  TBitFieldUnion = Record
    Case boolean Of
      true: (field: TBitfield);
      false: (data: byte);
  End;

  { TForm1 }

Procedure TForm1.Button1Click(Sender: TObject);
Var
  t: TBitFieldUnion;
  b: Byte;
Begin
  showmessage(inttostr(SizeOf(TBitfield)));
  t.field.Field1Bit := 1;
  t.field.Field2Bit := 2;
  t.field.Field5Bit := 16;
  b := t.data;
  showmessage(inttostr(b));

End;   
--
Just try it

PascalDragon
Beiträge: 1003
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: Wie funktioniert h2pas

Beitrag von PascalDragon »

Mathias hat geschrieben: So 2. Nov 2025, 09:27

Code: Alles auswählen

Warning: linker: /usr/bin/ld: -lstdc++ kann nicht gefunden werden: Datei oder Verzeichnis nicht gefunden
Da habe ich mich auch schon zig mal gefragt, wieso dieser Fehler unter Linux kommt. Es wird sogar gemotzt, wen die passende "-dev" fehlt.
Bei Windows wird anstandslos gelinkt, auch wen die passende DLL fehlt. Windows motzt erst, wen man die exe ausführen will, was auch logisch ist.
Anscheinend ist der Linker von Windows intelligenter als der von Linux.
Das hat nichts mit "intelligent" zu tun, sondern mit den Anforderungen des Objektformats: Unter ELF referenziert eine Binary benötigte Bibliotheken anhand ihres SONAME, der in der Binary steht und nicht notwendigerweise mit dem Dateinamen übereinstimmen muss. Deswegen ist es auf ELF Systemen (und auch auf MACH-O Systemen aus ähnlichen Gründen) notwendig, dass die Bibliotheken vorhanden sind. Dabei wird dann auch gleich geprüft, dass alle gewünschten Symbole auch tatsächlich vorhanden sind. Bei PE findet man das halt erst zur Ladezeit der Anwendung heraus, wenn Windows sich dann über fehlende Symbole brüskiert...
Warf hat geschrieben: So 2. Nov 2025, 13:18 Naja der Linker in Windows kann keinen Fehler werfen, weil der FPC unter Windows keinen Linker verwendet :D
Natürlich verwendet FPC einen Linker unter Windows. Nur weil der Linker intern ist ändert es nichts daran, dass es ein Linker ist. FPC hat auch einen internen ELF-Linker (standardmäßig deaktiviert, aber nichtsdestotrotz). Genauso kann FPC unter Windows GCCs ld.exe verwenden.
Warf hat geschrieben: So 2. Nov 2025, 13:18Wie bereits schon gesagt ist das konzept Object Files und Linking etwas das aus dem ELF Format rausfällt. Windows verwendet das nicht.
Windows verwendet das genauso. Dort sind die Objektdateien COFF-Dateien und die finale Binary ist dann PE/COFF. Sowohl der Microsoft Linker link.exe, als auch GCCs ld.exe wie auch FPCs interner Linker funktionieren hier ähnlich.
Warf hat geschrieben: So 2. Nov 2025, 13:18Dabei hat der FPC natürlich auch zusätzliche Infos aus dem Pascal code und weiß was wo definiert ist und was fehlt. Diese Info hat der Linux Linker nicht Sprachspezifisch ist kann der nicht wissen was wo definiert ist.
Nein, der interne Linker hat keine sprachspezifischen Kenntnisse, da er direkt mit den Objektdateien arbeitet und schließlich auch mit Objektdateien klarkommen muss, die nicht von FPC erzeugt wurden. Ganz davon abgesehen, dass die Schnittstelle zum Linker die gleiche ist, unabhängig ob er intern oder extern ist, Stichwort "Abstraktion".
Warf hat geschrieben: So 2. Nov 2025, 13:18Es gibt zwar Sprachen die auch unter Windows einen Linker verwenden, und Microsoft stellt z.B. für ihren C++ compiler auch einen bereit und der FPC könnte auch darauf zurückgreifen, aber das wichtige ist das bei Windows der nicht Notwendig ist, weil das PE Format ohne externe Linker auskommt. ELF hingegen nicht.
Das eine hat mit dem anderen null zu tun. FPC verwendet unter Windows einen internen Linker, weil der einfach schneller ist als GCCs ld.exe.
FPC Compiler Entwickler

PascalDragon
Beiträge: 1003
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: Wie funktioniert h2pas

Beitrag von PascalDragon »

corpsman hat geschrieben: Mo 3. Nov 2025, 07:41
Mathias hat geschrieben: Fr 31. Okt 2025, 18:39

Code: Alles auswählen

struct test_struct_t {
    unsigned Field1Bit: 1;
    unsigned Field2Bit: 2;
    unsigned Field6Bit: 6;
}
Die geht, sogar ohne Kopfrechnen.

Code: Alles auswählen

type
  TTestRec = bitpacked record
    Field1Bit: 1 shl 1 - 1;
    Field2Bit: 3 shl 3 -1;
    Field6Bit:6 shl 6 - 1;
  end;
Sry, aber was du da gepostet hast ist nicht richtig, hier mal die Version die auch vom Compiler akzeptiert wird ;)

Code: Alles auswählen


Type
  // Zugriff Bitbassiert
  TBitfield = bitpacked Record
    Field1Bit: 0..(1 Shl 1) - 1;
    Field2Bit: 0..(1 Shl 2) - 1;
    Field5Bit: 0..(1 Shl 5) - 1; // Dein Beispiel hatte hier 6, aber das wären dasn 7-Bit = 2 byte..
  End;

  // Union zum einfachen Konvertieren ;)
  TBitFieldUnion = Record
    Case boolean Of
      true: (field: TBitfield);
      false: (data: byte);
  End;

  { TForm1 }

Procedure TForm1.Button1Click(Sender: TObject);
Var
  t: TBitFieldUnion;
  b: Byte;
Begin
  showmessage(inttostr(SizeOf(TBitfield)));
  t.field.Field1Bit := 1;
  t.field.Field2Bit := 2;
  t.field.Field5Bit := 16;
  b := t.data;
  showmessage(inttostr(b));

End;   
In FPC main kann man das Ganze noch etwas komfortabler machen. ;)

Code: Alles auswählen

program trange;

{$mode objfpc}
{$modeswitch advancedrecords}

type
  generic TGenRange<const N: Byte> = record
  type
    Range = 0..(1 shl N) - 1;
  end;

  TRec = bitpacked record
    a: specialize TGenRange<1>.Range;
    b: specialize TGenRange<2>.Range;
    c: specialize TGenRange<5>.Range;
  end;

var
  r: TRec;
begin
  Writeln(BitSizeOf(r));
end.
FPC Compiler Entwickler

wennerer
Beiträge: 645
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: Wie funktioniert h2pas

Beitrag von wennerer »

Hallo zusammen,
ich hätte da noch eine Frage zur Bedienung von h2pas. Wenn ich mehrere Header hinzugefügt habe und möchte die Reihenfolge ändern dachte ich das ginge mit "Move file up" bzw. "Move file down". Aber leider passiert beim Klicken entweder gar nichts oder es kommt eine Fehlermeldung:
h2pasFehlermeldung.png
h2pasFehlermeldung.png (108.26 KiB) 87 mal betrachtet
Es ist auch ganz egal welche Datei ich wähle (Anfang, Ende oder Mittendrin). Ich hab mir auch eine neue stable extra installiert (Lazarus 3.6 (rev lazarus_3_6) FPC 3.2.2 x86_64-linux-gtk2). Das Verhalten ist exakt gleich zu meiner älteren Lazarus Version.

Weiß jemand wo mein Fehler liegt?

Viele Grüße
Bernd

Mathias
Beiträge: 7090
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Wie funktioniert h2pas

Beitrag von Mathias »

Hallo zusammen,
ich hätte da noch eine Frage zur Bedienung von h2pas. Wenn ich mehrere Header hinzugefügt habe und möchte die Reihenfolge ändern dachte ich das ginge mit "Move file up" bzw. "Move file down". Aber leider passiert beim Klicken entweder gar nichts oder es kommt eine Fehlermeldung:
Von diesem Tool lasse ich die Finger, ich mache es lieber direkt über die Kommandozeile.

Lasst du die C-Header direkt ohne Vorbearbeitung durch dieses Tool ?
Dies geht zu 95% nicht.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wennerer
Beiträge: 645
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: Wie funktioniert h2pas

Beitrag von wennerer »

Hallo Mathias,
wie gesagt ich hab da noch gar keine Erfahrungen gemacht. Und ja da kommen jede Menge Fehlermeldungen. Kannst du etwas genauer Beschreiben was du mit Vorbearbeitung der C-Header meinst? Wie gehst du da vor, bzw. nach welchen Kriterien legst du die Reihenfolge fest.

Viele Grüße
Bernd

Mathias
Beiträge: 7090
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Wie funktioniert h2pas

Beitrag von Mathias »

Kannst du etwas genauer Beschreiben was du mit Vorbearbeitung der C-Header meinst?
Dann zeig mal eine Header, welchen du übersetzen willst.
Dann kann ich dir sicher gewisse Punkte erklären.

Ich habe da mal einen Ausschnitt aus gtk4.

Code: Alles auswählen

GDK_AVAILABLE_IN_ALL
GType          gtk_button_get_type          (void) G_GNUC_CONST;
GDK_AVAILABLE_IN_ALL
GtkWidget*     gtk_button_new               (void);
Da wir dich h2pas mit Fehlern bombardieren.
Da muss alles raus was in Blockschrift ist.

Code: Alles auswählen

GType          gtk_button_get_type          (void);
GtkWidget*     gtk_button_new               (void);
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wennerer
Beiträge: 645
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: Wie funktioniert h2pas

Beitrag von wennerer »

Also wie weiter oben schon gesagt möchte ich UDP bei meinem ESP8266 nutzen. Leider fehlen mir da die Bindings. Mein Fernziel wäre es diese Bindings zu erstellen. Ich denke die passenden Headerdateien sind hier zu finden:

https://github.com/nodemcu/nodemcu-firm ... clude/lwip

Ich habe als erstes die Udp.h hinzugefügt und dann jeweils alle *.h Dateien die mit include eingebunden sind. Da kommen dann einige zusammen.

Ich hänge mal die Udp.h an. Vielleicht kannst du mir damit schon ein paar wichtige Tipps zeigen.

Viele Grüße
Bernd
Dateianhänge
udp.h
(6.27 KiB) 16-mal heruntergeladen

Antworten