GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Bedingte Kompilierung in C++ basierend auf dem Betriebssystem

Mein gcc (4.3.3) definiert die folgenden Linux-bezogenen vordefinierten Makros:

$ gcc -dM -E - < /dev/null | grep -i linux
#define __linux 1
#define __linux__ 1
#define __gnu_linux__ 1
#define linux 1

Unter VC++ (und vielen anderen Win32-Compilern) gibt es auch einige vordefinierte Makros, die die Plattform identifizieren, insbesondere _WIN32. Weitere Details:http://msdn.microsoft.com/en-us/library/b0084kay(VS.80).aspx


Dafür gibt es keine Standardmethode. Es kann möglich sein, bestimmte Makros, die pro Plattform definiert sind, auszuschalten. Beispielsweise wird _WIN32 unter Windows definiert und mit ziemlicher Sicherheit nicht unter Linux. Ich kenne jedoch kein entsprechendes Linux-Makro.

Da Sie separate Compiler verwenden, haben Sie folglich auch separate Build-Umgebungen. Warum fügst du das Makro nicht einfach selbst hinzu? Sowohl Visual Studio als auch GCC unterstützen die Definition von Makros über die Befehlszeile, also definieren Sie sie einfach.


Ich versuche immer, die Plattformspezifika aus dem Hauptcode herauszuhalten, indem ich es so mache

Plattform.h:

#if BUILD_PLATFORM == WINDOWS_BUILD
#include "windows_platform.h"
#elif BUILD_PLATFORM == LINUX_BUILD
#include "linux_platform.h"
#else
#error UNSUPPORTED PLATFORM
#endif

irgendeineklasse.c:

void SomeClass::SomeFunction()
{
   system_related_type t;
   // Other code
   platform_SystemCall(&t);
   // Other code
}

Jetzt in windows_platform.h und linux_platform.h Sie geben system_related_type ein zum nativen Typ und entweder #define platform_SystemCall B. den nativen Aufruf, oder erstellen Sie eine kleine Wrapper-Funktion, wenn die Argumente von einer Plattform zur anderen zu unterschiedlich sind.

Wenn sich die System-APIs für eine bestimmte Aufgabe zwischen den Plattformen stark unterscheiden, müssen Sie möglicherweise Ihre eigene Versions-API erstellen, die den Unterschied aufteilt. Aber zum größten Teil gibt es ziemlich direkte Zuordnungen zwischen den verschiedenen APIs unter Windows und Linux.

Anstatt sich auf einen bestimmten Compiler #define zu verlassen, um die Plattform auszuwählen, habe ich #define BUILD_PLATFORM xxx in der Projektdatei oder im Makefile, da diese sowieso plattformspezifisch eindeutig sein müssen.


Linux
  1. Fragen Sie Ihr Linux-Betriebssystem wie eine Datenbank ab

  2. Konfigurieren Sie Apache auf dem Ubuntu-Betriebssystem

  3. Konfigurieren Sie den MySQL-Server auf dem Ubuntu-Betriebssystem

  4. Planen Sie Neustarts im Ubuntu-Betriebssystem

  5. Wie überprüfe ich das Betriebssystem in Python?

Redox OS:ein in Rust geschriebenes Betriebssystem

Erste Schritte mit dem Linux-Betriebssystem

Ist Linux ein Betriebssystem oder ein Kernel?

Finden Sie Linux-Systemdetails mit Python

Windows vs. MacOS vs. Linux – Betriebssystemhandbuch

Top 10 Unix-basierte Betriebssysteme