32 bit und 64 bit Programm als target - Fallstricke?

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
Martin V
Beiträge: 142
Registriert: Sa 30. Jan 2010, 19:35
OS, Lazarus, FPC: Linux64, Wiindows32, MacOS, Lazarus 1.8.2
CPU-Target: xxBit

32 bit und 64 bit Programm als target - Fallstricke?

Beitrag von Martin V »

Was muß ich beachten, wenn ich beispielsweise ein bislang für Linux 32-bit ausgetestes Programm für Linux 64-bit generieren lasse?
- Ändern sich die Größen von Variablen? (Ich denke mal dass ich alle Speicheranforderungen mit "sizeof" versehen habe, bin aber nicht sicher)

Gibt es Fallstricke, die ich berücksichtigen muß?
Gibt es Hilfeseiten, die sich speziell mit diesen Problemen beschäftigen?

Wenn ich auf dem Mac compiliere, habe ich dann eigentlich ein 32- oder ein 64-bit-Programm?
Gibt es einen Grund, ein Windows 32 Programm für Windows 64 zu veröffentlichen?
Läuft ein Linux 32 Programm auf einem Linux 64 System? (Ein User meines Programms berichtete, es liefe nicht. Ist das grundsätzlich so oder hat er ein anderes Problem.)

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: 32 bit und 64 bit Programm als target - Fallstricke?

Beitrag von Socke »

Martin V hat geschrieben:- Ändern sich die Größen von Variablen? (Ich denke mal dass ich alle Speicheranforderungen mit "sizeof" versehen habe, bin aber nicht sicher)

Alle Zeigertypen ändern sich (untypisierte und typisierte Zeiger, Variablen für dynamische Arrays, Klassenvariablen, Interfaces, etc.). Falls du Zeiger in Ganzzahl casten möchstest, gibt es PtrInt und PtrUInt.

Für Dimensionen im Speicher (Länge von Strings/Arrays) sollte SizeInt bzw. SizeUInt verwendet werden.

Martin V hat geschrieben:Gibt es Hilfeseiten, die sich speziell mit diesen Problemen beschäftigen?

Im Free Pascal Wiki finden sich mit Sicherheit einige Informationen.

Martin V hat geschrieben:Wenn ich auf dem Mac compiliere, habe ich dann eigentlich ein 32- oder ein 64-bit-Programm?
Gibt es einen Grund, ein Windows 32 Programm für Windows 64 zu veröffentlichen?
Läuft ein Linux 32 Programm auf einem Linux 64 System? (Ein User meines Programms berichtete, es liefe nicht. Ist das grundsätzlich so oder hat er ein anderes Problem.)

Bei Mac ist AFAIK das abhängig vom WidgetSet.
Bei Win64 gab es einen Fehler in der Exception-Behandlung im Free Pascal Compiler. Hier solltest du eine hinreichend aktuelle Version verwenden.
Unter Linux müssen natürlich die passenden Bibliotheken zur jeweiligen Programmversion installiert sein. D.h. von den wichtigsten Bibliotheken (z.B. GTK/QT) hat man dann alles in 32 und 64 Bit installiert.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

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

Re: 32 bit und 64 bit Programm als target - Fallstricke?

Beitrag von Mathias »

Für Dimensionen im Speicher (Länge von Strings/Arrays) sollte SizeInt bzw. SizeUInt verwendet werden.

Somit müsste folgender Code so aussehen ?

Code: Alles auswählen

  procedure WriteFloatArray(a: TSingleArray; stream: TFileStream);
  var
    //    len: integer;
    len: SizeUInt;
  begin
    len := Length(a);
    stream.Write(len, SizeOf(len));
    if len > 0 then begin
      stream.Write(a[0], len * SizeOf(a[0]));
    end;
  end;

Ist SizeUInt immer gleich gross, egal ob 32 oder 64Bit ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: 32 bit und 64 bit Programm als target - Fallstricke?

Beitrag von Socke »

Mathias hat geschrieben:Ist SizeUInt immer gleich gross, egal ob 32 oder 64Bit ?

SizeInt und SizeUInt sind keine nativen Datentypen (die der Compiler kennt). Du kannst dir deren Deklaration im Quelltext ansehen.
Auf 32 Bit sind SizeInt und SizeUInt 32 Bit groß; auf 64 Bit-Systemen je 64 Bit.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

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

Re: 32 bit und 64 bit Programm als target - Fallstricke?

Beitrag von Warf »

Wenn ich auf dem Mac compiliere, habe ich dann eigentlich ein 32- oder ein 64-bit-Programm?
Gibt es einen Grund, ein Windows 32 Programm für Windows 64 zu veröffentlichen?
Läuft ein Linux 32 Programm auf einem Linux 64 System? (Ein User meines Programms berichtete, es liefe nicht. Ist das grundsätzlich so oder hat er ein anderes Problem.)
´
Auf Mac OS müssen GUI Anwendungen die das carbon Widgetset unterstützen 32 Bit Anwendungen sein, für Cocoa 64 Bit, für Konsolenanwendungen ist das dort egal.

64 Bit Programme ermöglichen es vor allem größere Speicheradressen zu verwalten, bei 32 Bit bist du beschränkt (ich glaube bei schon 2 GB unter windows) Außerdem, AFAIK, sind 32 Bit programme mit 32 Bit Typen(Integer, Cardinal, Single) schneller, 64 Bit Anwendungen mit 64 Bit großen Typen(Int64, QWord, Double).

Außerdem, zumindest unter Windows, sind 64 bit Programme größer, der Unterschied kann schon so 1 MB oder so ausmachen

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

Re: 32 bit und 64 bit Programm als target - Fallstricke?

Beitrag von Mathias »

SizeInt und SizeUInt sind keine nativen Datentypen (die der Compiler kennt). Du kannst dir deren Deklaration im Quelltext ansehen.
Auf 32 Bit sind SizeInt und SizeUInt 32 Bit groß; auf 64 Bit-Systemen je 64 Bit.

Somit währen also die Daten bei meinem Code inkompatibel, je nachdem ich 32 oder 64bit kompiliere.
Da wäre in meinem Fall Int32 besser, der ist immer 32Bit gross.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten