在编译时确定操作系统

7

我是QT的新手,目前在试图了解如何在主函数执行之前确定操作系统。由于我对此领域完全不熟悉,因此非常需要指导。

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

Windows
Unix
Linux
Mac

还有,我该如何在主函数中使用这些数据?

非常感谢。


1
通常使用带有 #define 的条件编译,因为源代码必须针对每个操作系统重新编译。 - Martin James
1
由于您是Qt的新手:QT是QuickTime,而Qt是C++库,请确保在引用C++库时使用正确的名称。 Qt的发音也是“可爱”,而不是“Que-Tee”。 - CJCombrink
5个回答

9

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

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


#ifdef _WIN32 // Code specific to Windows #endif
#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上!”?谢谢! - NSPredator
如果程序是为Linux编译的,它无论如何都无法在Windows上运行 :) - OMGtechy
哦,抱歉。但是Qt程序肯定可以在Windows和Linux上运行吧? - NSPredator
1
@NSPredator 是的,但你必须重新编译。Qt 允许你在不改变代码的情况下重新编译,但你仍然需要为目标平台重新编译。 - OMGtechy

5

这在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

4

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

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


谢谢您确认在Linux上定义了Q_OS_UNIX。 - Geoff Hutchison

1
你可以使用预处理器宏和-DOPERATING_SYSTEM=<...>,并将其用于设置变量的值。
enum OperatingSystem {OS_WINDOWS, OS_UNIX, OS_LINUX, OS_MAX};
OperatingSystem os = OPERATING_SYSTEM;

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

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


当我编译你的代码时,出现了以下错误:'OperatingSystem'在函数int main中不是一个类型名称os未在此范围内声明 - NSPredator
当您在每个“OperatingSystem os…”前面添加“static”时会发生什么? - CJCombrink
我找到了问题:你拼错了变量 OperatingSytem,应该是 OperatingSystem - NSPredator
根据我的经验,Q_OS_UNIX适用于所有基于Unix的操作系统,包括Mac OS X。因此,在上面的示例中,OS_MAC情况是不可达的,因为它总是首先到达OS_UNIX情况。 - Matt M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接