2010-06-17 55 views
18

我需要弄清楚我的程序在运行时运行的操作系统。在C++运行时获取当前操作系统

我正在使用Qt 4.6.2,MinGW和Eclipse与CDT。我的程序将在Windows或Linux上运行命令行QProcess。现在我需要一种开关来根据操作系统运行不同的代码。

Thx

回答

20

其实操作系统是由Q_OS _...宏定义的。只是说。 Q_WS _...是窗口系统。不完全一样。 (我正在读这个问题的作者......“操作系统”)。

这些声明可以在qglobal.h文件中找到。

Use Q_OS_x with x being one of: 

DARWIN - Darwin OS (synonym for Q_OS_MAC) 
SYMBIAN - Symbian 
MSDOS - MS-DOS and Windows 
OS2  - OS/2 
OS2EMX - XFree86 on OS/2 (not PM) 
WIN32 - Win32 (Windows 2000/XP/Vista/7 and Windows Server 2003/2008) 
WINCE - WinCE (Windows CE 5.0) 
CYGWIN - Cygwin 
SOLARIS - Sun Solaris 
HPUX  - HP-UX 
ULTRIX - DEC Ultrix 
LINUX - Linux 
FREEBSD - FreeBSD 
NETBSD - NetBSD 
OPENBSD - OpenBSD 
BSDI  - BSD/OS 
IRIX  - SGI Irix 
OSF  - HP Tru64 UNIX 
SCO  - SCO OpenServer 5 
UNIXWARE - UnixWare 7, Open UNIX 8 
AIX  - AIX 
HURD  - GNU Hurd 
DGUX  - DG/UX 
RELIANT - Reliant UNIX 
DYNIX - DYNIX/ptx 
QNX  - QNX 
QNX6  - QNX RTP 6.1 
LYNX  - LynxOS 
BSD4  - Any BSD 4.4 system 
UNIX  - Any UNIX BSD/SYSV system 

窗口系统的定义是这样的:

Use Q_WS_x where x is one of: 

MACX  - Mac OS X 
MAC9  - Mac OS 9 
QWS  - Qt for Embedded Linux 
WIN32 - Windows 
X11  - X Window System 
S60  - Symbian S60 
PM  - unsupported 
WIN16 - unsupported 

一个使用的#ifdef的主要问题是要确保,如果你在一个“新”平台编译(编译从未软件在该平台上),那么你要使用#elif defined(...)和至少一个#else + #error ......

#ifdef W_OS_LINUX 
    std::cout << "Linux version"; 
#elif defined(W_OS_CYGWIN) 
    std::cout << "Cygwin version"; 
#else 
#error "We don't support that version yet..." 
#endif 
+1

不知道为什么这是被接受的答案,因为OP询问**运行时**这一事实**编译时间**。 – TranslucentCloud 2016-09-26 11:19:55

+1

@TranslucentCloud,因为在编译时你已经可以获得这些信息,所以不需要在运行时执行它。然后你可以在正确的'#ifdef'块中做任何你需要做的事情。 – 2016-09-26 16:43:17

+0

那么你想告诉的是,确定实际启动代码的机器的操作系统特定细节绝对没有必要吗?设想一个简单的工具,用于向用户显示有关其操作系统和环境的所有可用信息。并给我提供一个例子,说明如何通过'Qt'和'#ifdef'指令来实现。至少对于CPU架构。 – TranslucentCloud 2016-09-26 19:47:38

3

在编译时使用#ifdef。

在windows下,定义了WIN32。

那么,这样做:

#ifdef WIN32 
// Windows code here 
#else 
// UNIX code here 
#endif 
+0

问题明确指定** runtime **。 -1。 – TranslucentCloud 2016-09-24 11:21:59

+0

@TranslucentCloud:在运行时几乎没有理由这么做 - 无论如何你都会重新编译。另外,接受的答案也是运行时 - 只是将它隐藏起来。 – houbysoft 2016-09-26 06:11:01

+1

1. OP问**明确**关于运行时间。 2.如果您想知道确切的操作系统版本,或者CPU体系结构,那么在运行时需要这样做。例如,请参阅我的回答,它说明了为什么在某些情况下,这些事情不应在编译时定义。 – TranslucentCloud 2016-09-26 11:09:45

1

这是通过使用预编译器指令来控制哪些代码块包含/从您的构建排除典型的做法。

#ifdef WIN32 
    // ... 
#endif 

这会导致(可以说)更丑陋的代码,但会导致目标二进制文件。

23

在Qt以下OS宏用于编译时间选项

//预先QT5 QT/X11 = Q_WS_X11定义定义。
定义了Qt/Windows = Q_WS_WIN。
QT /的Mac OS X = Q_WS_MACX定义

//对于QT5起 QT/X11 = Q_OS_X11定义。
定义Qt/Windows = Q_OS_WIN。
Qt/Mac OS X = Q_OS_MACX定义为

然后QSysInfo类为您提供操作系统版本和其他选项在运行时。

+0

QT特定的宏。我喜欢。 +1 – Randolpho 2010-06-17 15:37:37

+0

好的,但是我必须根据操作系统提供不同的版本? – 2010-06-17 15:38:46

+1

@瓦尔:是的,绝对。这不是一件坏事。 – Randolpho 2010-06-17 15:40:03

9

如果您确实需要在运行时间进行此操作,Qt会提供QSysInfo。用于附加到崩溃报告,但对于其他任何尝试在编译时做它。

7

由于QT5 macroses Q_WS_ *不明确d!

您应该使用Q_OS_ * macroses代替:

Q_OS_AIX 
Q_OS_ANDROID 
Q_OS_BSD4 
Q_OS_BSDI 
Q_OS_CYGWIN 
Q_OS_DARWIN - Darwin-based OS such as OS X and iOS, including any open source version(s) of 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 - Darwin-based OS distributed by Apple, which currently includes OS X and iOS, but not the open source version. 
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 - 32-bit and 64-bit versions of Windows (not on Windows CE). 
Q_OS_WIN64 
Q_OS_WIN - all supported versions of Windows. That is, if Q_OS_WIN32, Q_OS_WIN64 or Q_OS_WINCE is defined. 
Q_OS_WINCE 
Q_OS_WINPHONE 
Q_OS_WINRT 

的更多细节的QtGlobal

1

文档运行QGuiApplication::platformName()

这更准确区分,例如 “eglfs” 或“DirectFB的“

+0

+1对于提到Qt4的'Q_WS_'XXX的其他答案而言,这是一个很好的__run-time__解决方案,用于在Qt5上确定GUI,如果它是这样的应用程序。 – SlySven 2018-01-20 19:44:43

4

大多数这些答案提供了解决方案,以确定所需的信息在编译时间,当你的应用程序正在编译你的开发机器。

这里是你如何在运行,当你的应用程序是由您的应用程序的用户对他们的机器运行获得所需的信息。

qDebug() << "currentCpuArchitecture():" << QSysInfo::currentCpuArchitecture(); 
qDebug() << "productType():" << QSysInfo::productType(); 
qDebug() << "productVersion():" << QSysInfo::productVersion(); 
qDebug() << "prettyProductName():" << QSysInfo::prettyProductName(); 

典型结果:

21:43:09.855 Debug: currentCpuArchitecture(): "x86_64" 
21:43:09.855 Debug: productType(): "windows" 
21:43:09.855 Debug: productVersion(): "10" 
21:43:09.855 Debug: prettyProductName(): "Windows 10 (10.0)" 

的文档QSysInfohere

+0

不应该是'QSysInfo :: windowsVersion()'? – 2017-08-30 12:26:08

+0

不,它应该是'QSysInfo :: WindowsVersion'。但是,从Qt 5.9开始,这已被弃用。我会马上更新答案。 – TranslucentCloud 2017-08-31 18:36:17

+0

实际上,它们看起来是一样的http://doc.qt.io/qt-5/qsysinfo-obsolete.html#WindowsVersion-var和http://doc.qt.io/qt-5/qsysinfo-obsolete .html#windowsVersion - 是的,他们现在都弃用 – 2017-09-05 11:46:22

相关问题