GNU/Linux >> Tutoriels Linux >  >> Linux

Compilation conditionnelle en C++ basée sur le système d'exploitation

Mon gcc (4.3.3) définit les macros prédéfinies suivantes liées à Linux :

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

Sous VC++ (et de nombreux autres compilateurs Win32), il existe également quelques macros prédéfinies identifiant la plate-forme, notamment _WIN32. Plus de détails :http://msdn.microsoft.com/en-us/library/b0084kay(VS.80).aspx


Il n'y a pas de méthode standard pour le faire. Il peut être possible de désactiver certaines macros définies par plate-forme. Par exemple, _WIN32 sera défini sur Windows et presque certainement pas sur Linux. Cependant, je ne connais aucune macro Linux correspondante.

Étant donné que vous utilisez des compilateurs distincts, il s'ensuit que vous disposez d'environnements de génération distincts. Pourquoi ne pas simplement ajouter la macro vous-même ? Visual Studio et GCC prennent en charge la définition de macros à partir de la ligne de commande, il vous suffit donc de les définir.


J'essaie toujours de garder les spécificités de la plate-forme hors du code principal en procédant de cette façon

plate-forme.h :

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

uneclasse.c :

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

Maintenant en windows_platform.h et linux_platform.h tu tapes system_related_type au type natif, et soit #define platform_SystemCall comme appel natif, ou créez une petite fonction wrapper, si l'argument défini d'une plate-forme à l'autre est trop différent.

Si les API système pour une tâche particulière sont très différentes d'une plate-forme à l'autre, vous devrez peut-être créer votre propre version d'API qui divise la différence. Mais pour la plupart, il existe des mappages assez directs entre les différentes API sous Windows et Linux.

Plutôt que de compter sur un compilateur particulier #define pour sélectionner la plate-forme, j'ai #define BUILD_PLATFORM xxx dans le fichier de projet ou le makefile, car ceux-ci doivent de toute façon être uniques par plate-forme.


Linux
  1. Interrogez votre système d'exploitation Linux comme une base de données

  2. Installer Docker (système d'exploitation basé sur Debian)

  3. Configurer Apache sur le système d'exploitation Ubuntu

  4. Configurer le serveur MySQL sur le système d'exploitation Ubuntu

  5. Appel au système d'exploitation pour ouvrir l'URL ?

Redox OS :un système d'exploitation écrit en Rust

Premiers pas avec le système d'exploitation Linux

Linux est-il un système d'exploitation ou un noyau ?

Trouver les détails du système Linux à l'aide de Python

Windows vs MacOS vs Linux - Manuel du système d'exploitation

Top 10 des systèmes d'exploitation basés sur Unix