在编译时确定操作系统

问题描述 投票:0回答:5

我是QT新手,我很难理解如何在执行主函数之前确定操作系统。我是这个领域的新手,因此我们将不胜感激。

我想确定程序是否在以下环境之一中运行:

Windows
Unix
Linux
Mac

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

非常感谢

c++ qt operating-system
5个回答
10
投票

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

例如,要检查您是否使用 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
}

6
投票

它很好地记录在 Qt5 的 QtGlobals 中
Qt6 有单独的标头:

<QtSystemDetection>

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

5
投票

Qt 本身为 Qt 支持的不同平台定义了预处理器开关。它们看起来都像

Q_OS_*
- * 部分被不同的操作系统替换。对于你的例子来说,那就是:

  • Windows:
    Q_OS_WIN
    Q_OS_WIN32
    Q_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_OSX
    Q_OS_MACX

所有这些平台标头均在

qsystemdetection.h
中定义。该文件包含几乎所有不同支持的操作系统及其预处理器开关的列表。


1
投票

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

#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。


1
投票

您可以将预处理器宏与

-DOPERATING_SYSTEM=<...>
结合使用,并用它来设置变量的值。

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

假设

OPERATING_SYSTEM
被定义为上述之一。

© www.soinside.com 2019 - 2024. All rights reserved.