GNU/Linux >> Znalost Linux >  >> Linux

Podmíněná kompilace v C++ na základě operačního systému

Moje gcc (4.3.3) definuje následující předdefinovaná makra související s Linuxem:

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

Pod VC++ (a mnoha dalšími kompilátory Win32) existuje také několik předdefinovaných maker identifikujících platformu, zejména _WIN32. Další podrobnosti:http://msdn.microsoft.com/en-us/library/b0084kay(VS.80).aspx


Neexistuje žádný standardní způsob, jak to udělat. Může být možné vypnout určitá makra, která jsou definována pro každou platformu. Například _WIN32 bude definován ve Windows a téměř jistě ne v Linuxu. Nevím však o žádném odpovídajícím makru pro Linux.

Protože používáte samostatné kompilátory, z toho vyplývá, že máte samostatná prostředí sestavení. Proč prostě nepřidáte makro sami? Visual Studio i GCC podporují definování maker z příkazového řádku, takže je stačí definovat.


Vždy se snažím udržet specifika platformy mimo hlavní kód tím, že to dělám tímto způsobem

platform.h:

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

someclass.c:

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

Nyní v windows_platform.h a linux_platform.h zadejtedef system_related_type na nativní typ a buď #define platform_SystemCall jako nativní volání, nebo vytvořte malou funkci wrapper, pokud je sada argumentů z jedné platformy na druhou příliš odlišná.

Pokud se systémová rozhraní API pro konkrétní úlohu mezi platformami výrazně liší, možná budete muset vytvořit vlastní verzi rozhraní API, která rozdíl rozdělí. Ale většinou existují poměrně přímá mapování mezi různými API na Windows a Linux.

Spíše než se spoléhat na nějaký konkrétní kompilátor #define pro výběr platformy, I #define BUILD_PLATFORM xxx v souboru projektu nebo makefile, protože ty musí být stejně jedinečné podle platformy.


Linux
  1. Nainstalujte Docker (operační systém založený na Debianu)

  2. Změňte port SSH v operačním systému Linux Ubuntu

  3. Nainstalujte IMAP pro PHP 7.1 na operační systém Ubuntu

  1. Dotazujte se na svůj operační systém Linux jako na databázi

  2. Volat do operačního systému pro otevření adresy URL?

  3. Co je to linuxový kontejner a linuxový hypervizor?

  1. Nakonfigurujte Apache v operačním systému Ubuntu

  2. Nakonfigurujte server MySQL na operačním systému Ubuntu

  3. Naplánujte restartování v operačním systému Ubuntu