88 Stimmen

Lazarus: Betriebssystem erkennen (Compiler Switch)

Tutorial von Stefan Trost | Letztes Update am 07.01.2023 | Erstellt am 17.05.2013

Schreibt man eine Anwendung für mehrere Betriebssysteme mit Lazarus, kann es nötig sein, je nach System an bestimmten Stellen einen unterschiedlichen Code auszuführen oder zum Beispiel andere Units einzubinden. Dennoch möchte man natürlich nicht dazu gezwungen sein, den gleichen Code immer wieder an das jeweilige System anzupassen, auf dem gerade kompiliert wird. Stattdessen möchte man eine einheitliche Lösung für alle Systeme vorhalten, die sich automatisch an das System auf dem gerade die Kompilation stattfindet, anpasst - selbst wenn der Code einige systemabhängige Teile enthält.

In diesem Tutorial möchte ich euch daher zeigen, wie ihr dem Compiler zeigen könnt, dass ein bestimmter Code oder ein bestimmter Teil einer Unit nur für ein bestimmtes System gilt. Dabei könnt ihr die sogenannten Compiler-Direktiven {$IFDEF}, {$ENDIF} sowie {$ELSE} verwenden.

Beispiel

Schauen wir uns dazu zunächst ein kleines Beispiel an:

{$IFDEF WINDOWS}
   {$IFDEF WIN32}
      ShowMessage('32-Bit Windows');
   {$ENDIF}

   {$IFDEF WIN64}
      ShowMessage('64-Bit Windows');
   {$ENDIF} 
{$ELSE}
   ShowMessage('Kein Windows');
{$ENDIF}

In diesem Beispiel benutzen wir zunächst eine IF-Abfrage, ob es sich um ein Windows-System handelt. Falls ja, schauen wir, ob es sich um ein 32-Bit oder 64-Bit Windows handelt und geben mit der Hilfe von ShowMessage eine entsprechende Meldung aus. Falls nein, geben wir eine Meldung aus, dass es sich bei dem System nicht um Windows handelt.

Anwendungsbereiche

Die Direktiven lassen sich beliebig kombinieren und an beliebiger Stelle nutzen. So kann man nicht nur Teile des Codes nur für bestimmte Systeme verfügbar machen sondern zum Beispiel auch ganze Prozeduren oder Funktionen inklusive ihrer Deklaration auf bestimmte Systeme beschränken oder zum Beispiel im USES-Bereich je nach System andere Units hinzufügen oder auslassen.

Ein typisches Beispiel wären systembezogene Units wie die Windows-Unit oder auch die Units ShellApi, CocoaAll oder BaseUnix, die je nach Unit nur unter Windows, macOS oder Linux nutzbar sind. Möchten wir Funktionen aus einer oder mehrerer dieser Units nutzen und den gleichen Code auch für andere Systeme verwenden, könnten wir zum Beispiel folgendes schreiben:

uses
  {$IFDEF WINDOWS} Windows, ShellApi, {$ENDIF}
  {$IFDEF DARWIN} CocoaAll, {$ENDIF}
  {$IFDEF LINUX} BaseUnix, {$ENDIF}
  Classes, SysUtils, FileUtil;

Damit würden die Units Windows und ShellApi nur eingebunden, wenn unter Windows kompiliert wird, CocoaAll nur unter macOS, BaseUnix nur unter Linux und die Units Classes, SysUtils und FileUtil auf allen Systemen.

Wichtig ist hier darauf aufzupassen dass der Code für alle Systemkombinationen Sinn ergibt. So sind hier zum Beispiel die Kommata so gesetzt, dass die Liste der Units immer korrekt mit Kommata getrennt ist, unabhängig davon, welches Bedingung gerade zutrifft.

Liste der Betriebssystem-Direktiven

In dieser Liste habe ich einmal die wichtigsten Direktiven für die jeweiligen Systeme für euch zusammengefasst.

SystemDirektive
Alle Windows Systeme{$IFDEF WINDOWS}
Windows 64 Bit{$IFDEF WIN64}
Windows 32 Bit{$IFDEF WIN32}
Windows 16 Bit{$IFDEF WIN16}
Windows CE{$IFDEF WINCE}
Linux{$IFDEF LINUX}
Mac OS X, macOS{$IFDEF DARWIN}
Classic Macintosh{$IFDEF MAC}
OS2{$IFDEF OS2}
FreeBSD{$IFDEF FREEBSD}
NetBSD{$IFDEF NETBSD}
OpenBSD{$IFDEF OPENBSD}
Amiga{$IFDEF AMIGA}
Atari{$IFDEF ATARI}
Nintendo DS{$IFDEF NDS}
MS-DOS{$IFDEF MSDOS}
PalmOS{$IFDEF PALMOS}
Android{$IFDEF ANDROID}

Neben diesen spezifischen Direktiven könnt ihr darüber hinaus mit {$IFDEF UNIX} beliebige Unix-Systeme ansprechen. Diese Direktive trifft für macOS, Mac OS X, FreeBSD, NetBSD, SunOS, OpenBSD und andere Linux- und Unix-Systeme zu. Mit {$IFDEF BSD} sprecht ihr sowohl FreeBSD als auch NetBSD und OpenBSD an.

Mehr Direktiven findet ihr auf freepascal.org auf der Seite Compiler Defines During Compilation. So lässt sich zum Beispiel auch feststellen, welche CPU benutzt wird, mit welcher Free Pascal Version kompiliert wird, ob bestimmte Features vorhanden sind und vieles mehr.

AntwortenPositivNegativDatumStimmen
33 Stimmen

Hmmm.... Deine 2te Zeile: {$IFDEF WIN64}

Sollte da nicht {$IFDEF WIN32} stehen?

Vielen Dank für deine Info/dein Tipp!
29.04.2021 um 16:05

AntwortenPositiv Negativ
33 Stimmen

Vielen Dank für den Hinweis!

Absolut richtig, da müsste WIN32 stehen. Ich habe die Stelle korrigiert.
29.04.2021 um 16:46

Positiv Negativ
33 Stimmen

Super!

Ich danke dir.

Das ist mir zuerst auch nicht aufgefallen, erst die doppelte Meldung war etwas komisch.
01.05.2021 um 17:31

Positiv Negativ
Antworten
Antworten

Über den Autor

AvatarSoftware von Stefan Trost finden Sie auf sttmedia.de. Benötigen Sie eine individuelle Software nach Ihren eigenen Wünschen? Schreiben Sie uns: sttmedia.de/kontakt
Profil anzeigen

 

Ähnliche Themen

Wichtiger Hinweis

Bitte beachten Sie: Die Beiträge auf askingbox.de sind Beiträge von Nutzern und sollen keine professionelle Beratung ersetzen. Sie werden nicht von Unabhängigen geprüft und spiegeln nicht zwingend die Meinung von askingbox.de wieder. Mehr erfahren.

Jetzt mitmachen

Stellen Sie Ihre eigene Frage oder schreiben Sie Ihren eigenen Artikel auf askingbox.de. So gehts.