【问题标题】:Determine Operating System during compile time在编译时确定操作系统
【发布时间】:2023-03-18 18:05:01
【问题描述】:

我是 QT 的新手,我正在努力了解如何在执行 main 函数之前确定操作系统。我是这个领域的新手,所以任何指导都将不胜感激。

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

Windows
Unix
Linux
Mac

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

非常感谢

【问题讨论】:

  • 通常使用带有#defines的条件编译,因为必须为每个操作系统重新编译源代码。
  • 由于您是 Qt 新手:QT 是 QuickTime,Qt 是 C++ 库,请确保在引用 C++ 库时使用正确的库。 Qt 也发音为“cute”,而不是“Que-Tee”

标签: c++ qt operating-system


【解决方案1】:

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

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

【讨论】:

  • 感谢您的回复。我还有一个问题:如果我在 Linux 机器上编译您的示例,然后将程序转移到 Windows 机器上。结果会有所不同还是仍会显示“我在 Linux 上!”?谢谢!
  • 如果程序是为 Linux 编译的,它无论如何都不会在 Windows 上运行 :)
  • 哦,对不起。但是 Qt 程序肯定会在 Windows 和 Linux 上运行吗?
  • @NSPredator 可以,但必须重新编译。 Qt 让您无需更改代码即可重新编译,但您仍需要针对目标平台重新编译。
【解决方案2】:

您可以使用带有-DOPERATING_SYSTEM=&lt;...&gt; 的预处理器宏并使用它来设置变量的值。

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

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

【讨论】:

    【解决方案3】:

    Qt 本身为 Qt 支持的不同平台定义了预处理器开关。它们看起来都像Q_OS_* - *-部分被不同的操作系统替换。例如,那将是:

    • 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 和 iO)、Q_OS_OSXQ_OS_MACX

    所有这些平台标头都在qsystemdetection.h 中定义。该文件包含几乎所有不同的受支持操作系统及其预处理器开关的列表。

    【讨论】:

    • 感谢您确认 Q_OS_UNIX 是在 Linux 上定义的。
    【解决方案4】:

    很好documented in 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
    

    【讨论】:

      【解决方案5】:

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

      #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;
          }
      
      } 
      

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

      【讨论】:

      • 编译您的代码时出现以下错误:'OperatingSystem' does not name a type in function int main os was not declared in this scope
      • 在每个 'OperatingSystem os...' 前面添加 'static' 会发生什么
      • 我发现了问题:你拼错了变量OperatingSytem,它应该是OperatingSystem
      • 根据我的经验,Q_OS_UNIX 是为所有基于 unix 的操作系统定义的,包括 Mac OS X。因此,上面示例中的 OS_MAC 情况无法访问,因为它总是首先到达 OS_UNIX 情况。跨度>
      猜你喜欢
      • 2010-09-18
      • 2014-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-10
      • 2013-01-02
      • 1970-01-01
      相关资源
      最近更新 更多