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.
System | Direktive |
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.
Über den Autor
Software 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
PHP switch/case: Bedingung mit mehreren Werten
Frage | 1 Antwort
jQuery: Tasten auf Tastatur Aktion zuweisen (Keyboard Event)
Tipp | 0 Kommentare
Switch: Wo schließe ich das Eingangs-Netzwerkkabel an?
Frage | 1 Antwort
Delphi/Lazarus: Link zu einer Website in einer Anwendung setzen
Tutorial | 0 Kommentare
HTML Formular: Weiterleitung abhängig von Radiobutton oder Checkbox
Tutorial | 0 Kommentare
Delphi/Lazarus: Kommandozeilen Parameter Tutorial Teil 2: Empfangen
Tutorial | 0 Kommentare
Lazarus: Datei oder Dokument plattformunabhängig öffnen
Tipp | 0 Kommentare
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.
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
Vielen Dank für den Hinweis!
Absolut richtig, da müsste WIN32 stehen. Ich habe die Stelle korrigiert.
29.04.2021 um 16:46
Super!
Ich danke dir.
Das ist mir zuerst auch nicht aufgefallen, erst die doppelte Meldung war etwas komisch.
01.05.2021 um 17:31