我需要弄清楚我的程序在运行时运行的操作系统。在C++运行时获取当前操作系统
我正在使用Qt 4.6.2,MinGW和Eclipse与CDT。我的程序将在Windows或Linux上运行命令行QProcess。现在我需要一种开关来根据操作系统运行不同的代码。
Thx
我需要弄清楚我的程序在运行时运行的操作系统。在C++运行时获取当前操作系统
我正在使用Qt 4.6.2,MinGW和Eclipse与CDT。我的程序将在Windows或Linux上运行命令行QProcess。现在我需要一种开关来根据操作系统运行不同的代码。
Thx
其实操作系统是由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
在编译时使用#ifdef。
在windows下,定义了WIN32。
那么,这样做:
#ifdef WIN32
// Windows code here
#else
// UNIX code here
#endif
问题明确指定** runtime **。 -1。 – TranslucentCloud 2016-09-24 11:21:59
@TranslucentCloud:在运行时几乎没有理由这么做 - 无论如何你都会重新编译。另外,接受的答案也是运行时 - 只是将它隐藏起来。 – houbysoft 2016-09-26 06:11:01
1. OP问**明确**关于运行时间。 2.如果您想知道确切的操作系统版本,或者CPU体系结构,那么在运行时需要这样做。例如,请参阅我的回答,它说明了为什么在某些情况下,这些事情不应在编译时定义。 – TranslucentCloud 2016-09-26 11:09:45
这是通过使用预编译器指令来控制哪些代码块包含/从您的构建排除典型的做法。
#ifdef WIN32
// ...
#endif
这会导致(可以说)更丑陋的代码,但会导致目标二进制文件。
在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类为您提供操作系统版本和其他选项在运行时。
如果您确实需要在运行时间进行此操作,Qt会提供QSysInfo。用于附加到崩溃报告,但对于其他任何尝试在编译时做它。
由于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
文档运行QGuiApplication::platformName()
这更准确区分,例如 “eglfs” 或“DirectFB的“
+1对于提到Qt4的'Q_WS_'XXX的其他答案而言,这是一个很好的__run-time__解决方案,用于在Qt5上确定GUI,如果它是这样的应用程序。 – SlySven 2018-01-20 19:44:43
大多数这些答案提供了解决方案,以确定所需的信息在编译时间,当你的应用程序正在编译你的开发机器。
这里是你如何在运行,当你的应用程序是由您的应用程序的用户对他们的机器运行获得所需的信息。
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)"
的文档QSysInfo
是here。
不应该是'QSysInfo :: windowsVersion()'? – 2017-08-30 12:26:08
不,它应该是'QSysInfo :: WindowsVersion'。但是,从Qt 5.9开始,这已被弃用。我会马上更新答案。 – TranslucentCloud 2017-08-31 18:36:17
实际上,它们看起来是一样的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
不知道为什么这是被接受的答案,因为OP询问**运行时**这一事实**编译时间**。 – TranslucentCloud 2016-09-26 11:19:55
@TranslucentCloud,因为在编译时你已经可以获得这些信息,所以不需要在运行时执行它。然后你可以在正确的'#ifdef'块中做任何你需要做的事情。 – 2016-09-26 16:43:17
那么你想告诉的是,确定实际启动代码的机器的操作系统特定细节绝对没有必要吗?设想一个简单的工具,用于向用户显示有关其操作系统和环境的所有可用信息。并给我提供一个例子,说明如何通过'Qt'和'#ifdef'指令来实现。至少对于CPU架构。 – TranslucentCloud 2016-09-26 19:47:38