Wann wir was verwendet ?
Ich habe bis jetzt schon mehrere C-Header übernommen und bin mit "cdecl" gut gefahren. Dies waren immer Linux Sachen.
Jetzt wollte ich eine OpenGL-Header ausprobieren.. Unter Linux funktioniert es wunderbar mit "cdecl". Aber unter Windows hatte ich Fehler.
Also habe ich versucht "cdecl" durch "stdcall" zu ersetzen und sehr das es läuft unter windows.
Und zur meiner Verwunderung auch mit Linux.
Gibt es da eine Unterschied zwischen Linux und Windows ?
Was ich gerade festgestellt habe, unter Linux kann ich es sogar ganz weglassen.
stdcall und cdecl
-
- Beiträge: 6969
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
stdcall und cdecl
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
Re: stdcall und cdecl
Hast du auch den Speicher überprüft?
https://www.freepascal.org/docs-html/pr ... -1750006.3
https://www.freepascal.org/docs-html/pr ... -1750006.3
Re: stdcall und cdecl
So etwas in der Art hatte ich auch schon und habe das mit Compilerschaltern gelöst.
Ich musste damals eine LIB für Fingerprint übersetzen. War dann für WIN und LIN unterschiedlich definiert mit stdcall und cdecl
Ich musste damals eine LIB für Fingerprint übersetzen. War dann für WIN und LIN unterschiedlich definiert mit stdcall und cdecl
Gruß, Michael
-
- Beiträge: 6969
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: stdcall und cdecl
Das werde ich wohl auch machen müssen.So etwas in der Art hatte ich auch schon und habe das mit Compilerschaltern gelöst.
Aber wieso das riessen durcheinander ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Beiträge: 964
- 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: stdcall und cdecl
Kompilierst du unter Windows für 32-Bit und unter Linux für 64-Bit? Die Aufrufkonventionen cdecl and stdcall sind nämlich nur für die i386-Plattform (und die i8086) relevant. Bei der x86_64-Plattform (und allen nicht-x86-Plattformen) gibt es nur eine einzige Aufrufkonvention.Mathias hat geschrieben: Sa 30. Mär 2024, 14:21 Gibt es da eine Unterschied zwischen Linux und Windows ?
Was ich gerade festgestellt habe, unter Linux kann ich es sogar ganz weglassen.
Würdest du also unter Linux für i386 kompilieren, würdest du Unterschiede zwischen cdecl und stdcall feststellen. Genauso wenn du unter Windows für x86_64 kompilieren würdest, würdest du eben keine Unterschiede feststellen.
Also entweder nutzt du {$CALLING ...} oder du nutzt anstatt cdecl/stdcall die Direktive winapi. Im Gegensatz zum Namen (welcher von Delphi kommt) steht das einfach für die Haupt-C-Aufrufkonvention der Plattform, also stdcall unter Windows und cdecl unter Linux und macOS.Mathias hat geschrieben: Sa 30. Mär 2024, 17:17Das werde ich wohl auch machen müssen.So etwas in der Art hatte ich auch schon und habe das mit Compilerschaltern gelöst.
Wie so gern: historisch. Microsoft hat sich eben für stdcall als sein Hauptkonvention für Windows unter 32-Bit x86 entschieden und die *nix-Systeme für cdecl.
FPC Compiler Entwickler