如何在C ++中运行时检测当前操作系统?

时间:2018-06-28 07:31:33

标签: c++ windows macos operating-system

我想检测我的.exe在哪个操作系统上运行,以便我可以根据基础操作系统执行特定的操作。我希望它仅适用于Windows和Mac。

3 个答案:

答案 0 :(得分:3)

  

我想检测我的.exe在哪个操作系统上运行

(请注意,在MacOSX上,可执行文件通常不带有.exe后缀;该约定特定于Windows)

您无法在运行时在标准C ++ 11中检测到这一点(因此,从技术上讲,这没有任何意义),因为C ++ 11标准{{3 }}不了解操作系统(某些C ++源代码可能是为裸机编译的)。我建议条件编译(例如#if)并使用特定于操作系统的标头(并配置n3337来检测它们)。某些C ++框架(build automationboostpoco ....)可能会有所帮助,但您需要决定选择一个框架(它们可能会尝试提供一些常见的{{3} },但细节仍然存在,例如Windows和MacOSX上的文件路径仍然不同。

Qt有自己的abstractions,称为MicroSoft Windows(实际上,Windows只能使用它。也许有一天API会实现该API的大部分) ,记录在WinAPI中。 ReactOS或多或少地符合here,后者是有关一系列操作系统的标准API(但Windows不太关心该标准)。

如果您想全面了解操作系统(明智的做法),请阅读例如MacOSX(可免费下载的教科书)。

实际上,从C ++源代码编译的POSIX文件特定于要在其上运行的操作系统,并且它的文件格式对于某些操作系统(例如{{3 }}在Windows上,Operating Systems: Three Easy Pieces在Linux上,executable在MacOSX上...)。因此,Windows可执行文件将无法在MacOSX上运行,反之亦然(specific的想法在2018年已经过时了)。您可能会针对您的操作系统调整PE过程(例如ELF,或使用Mach-Ofat binary等)。该构建过程可能(并且经常)传递额外的编译标志(例如,某些-DBUILD_FOR_MACOSX编译器build,如果是针对MacOSX进行构建的话;那么您可能会在少数地方使用一些{{1}这样的预处理程序指令}(在您的C ++源代码中)特定于目标操作系统。您甚至可以自定义构建,以便在MacOSX上编译一些#if BUILD_FOR_MACOSX C ++文件(及其链接到其目标文件),但是在Windows上,您将使用其他for-macosx.cc C ++文件。有时,构建过程足够灵活,可以在构建时自动检测什么操作系统(但是如何执行此操作是一个不同的问题。GNUMakefile可能会鼓舞人心)。

一旦为您的操作系统配置了构建过程(或已自动检测到构建过程),则可以使用预处理器cmakefor_windows.cc适当的系统特定的头文件并编译对OS特定功能的调用(例如POSIX ninja)在运行时进一步查询操作系统。

某些编译器预定义了一组预处理器符号,该符号集取决于目标操作系统和处理器以及您的编译器。如果使用flag for your preprocessor,则可以创建一些 empty 文件#include并使用empty.cc进行编译(也许还使用其他相关标志,例如g++ -c -C -E -dM )以找出您所用的预定义符号集。

考虑研究一些跨平台的autoconf项目(例如,在conditional facilities或其他地方)的源代码(包括构建过程!)以获取启发。您还可以找到许多有关多平台C ++构建的资源(例如uname和其他许多)。

答案 1 :(得分:0)

您可以通过多种方式执行此操作,例如测试C:\ Windows目录是否存在以检测Windows(编辑:如果OS完全接受这样的路径,则它至少是DOS系列的一部分) ,但都不是万无一失的。这是一种方法(尽管它在作弊):

,

此外,如果您只想显示用户名,则在POSIX系统上可以使用uname(2)。

答案 2 :(得分:0)

要解决此类问题,您需要在编译时和运行时都进行检查。对于两个不同的系统,您将需要不同的代码。您将需要Windoze代码检查Windoze版本,并需要Mac代码检查Mac版本。

您将不得不使用

#if defined ()

在编译时检查您正在使用哪两个。然后为每个获取单独的代码以获取版本。

相关问题