繁体   English   中英

在编译期间确定操作系统

[英]Determine Operating System during compile time

我是QT的新手,我很难理解在执行main函数之前如何确定操作系统。 我是这个领域的一个完整的新手,所以任何指导将不胜感激。

我想确定该程序是否在以下某个环境中运行:

Windows
Unix
Linux
Mac

另外我如何在main函数中使用这些数据?

非常感谢

您可以使用预处理器定义来确定编译代码的平台。

例如,要检查您是否在Windows上:

#if (defined (_WIN32) || defined (_WIN64))
    // windows code
#endif

对于Linux:

#if (defined (LINUX) || defined (__linux__))
    // linux code
#endif

...对于您感兴趣的每个平台等等。这样,将删除与您定位的平台无关的代码。

以下是使用此代码的一些代码的示例:

#include <iostream>

int main()
{
    #if (defined (_WIN32) || defined (_WIN64))
        std::cout << "I'm on Windows!" << std::endl;
    #elif (defined (LINUX) || defined (__linux__))
        std::cout << "I'm on Linux!" << std::endl;
    #endif
}

Qt本身为Qt支持的不同平台定义了预处理器 - 交换机。 它们看起来都像Q_OS_* - * -part被不同的操作系统取代。 举个例子,那就是:

  • Windows系统: Q_OS_WINQ_OS_WIN32Q_OS_WIN64 (有几个, Q_OS_WINCE例如,但Q_OS_WIN对于所有的Windows风格的操作系统定义)
  • Unix: Q_OS_UNIX
  • Linux: Q_OS_LINUX (请注意, Q_OS_UNIX也在linux上定义)
  • Mac: Q_OS_MAC (用于OsX和iOs), Q_OS_OSXQ_OS_MACX

所有这些plattform-headers都在qsystemdetection.h中定义。 此文件包含几乎所有不同支持的操作系统及其预处理器 - 开关的列表。

您可以将预处理器宏与-DOPERATING_SYSTEM=<...>使用,并使用它来设置变量的值。

enum OperatingSytem {OS_WINDOWS, OS_UNIX, OS_LINUX, OS_MAX};
OperatingSystem os = OPERATING_SYSTEM;

它假定OPERATING_SYSTEM被定义为上述之一。

在QtGlobals中很好地记录了它

Q_OS_AIX
Q_OS_ANDROID
Q_OS_BSD4
Q_OS_BSDI
Q_OS_CYGWIN
Q_OS_DARWIN
Q_OS_DGUX
Q_OS_DYNIX
Q_OS_FREEBSD
Q_OS_HPUX
Q_OS_HURD
Q_OS_IOS
Q_OS_IRIX
Q_OS_LINUX
Q_OS_LYNX
Q_OS_MAC
Q_OS_NETBSD
Q_OS_OPENBSD
Q_OS_OSF
Q_OS_OSX
Q_OS_QNX
Q_OS_RELIANT
Q_OS_SCO
Q_OS_SOLARIS
Q_OS_ULTRIX
Q_OS_UNIX
Q_OS_UNIXWARE
Q_OS_WIN32
Q_OS_WIN64
Q_OS_WIN
Q_OS_WINCE
Q_OS_WINPHONE
Q_OS_WINRT

所有其他例子都涵盖了要点,但只是为了澄清:

#include <QtGlobal>
#include <QDebug>

enum OperatingSytem {OS_WINDOWS, OS_UNIX, OS_LINUX, OS_MAC};

#if (defined (Q_OS_WIN) || defined (Q_OS_WIN32) || defined (Q_OS_WIN64))
    OperatingSystem os = OS_WINDOWS;
#elif (defined (Q_OS_UNIX))
    OperatingSystem os = OS_UNIX;
#elif (defined (Q_OS_LINUX))
    OperatingSystem os = OS_LINUX;
#elif (defined (Q_OS_MAC))
    OperatingSystem os = OS_MAC;
#endif

int main() {

    switch(os) {
         case OS_WINDOWS: qDebug() << "Windows"; break;
         case OS_UNIX   : qDebug() << "Unix"; break;
         case OS_LINUX  : qDebug() << "Linux"; break;
         case OS_MAC    : qDebug() << "Mac"; break;
         default        : qDebug() << "Unknown"; break;
    }

} 

正如其他一条评论中所提到的,Unix可以在linux上定义,所以你可能需要在那里进行一些其他检查,但你真的需要知道它是Unix还是Linux。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM