在运行期间使用C++获取当前操作系统

Kai*_*alz 22 c++ qt operating-system

我需要弄清楚我的程序在运行时运行的操作系统.

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

谢谢

Mar*_*ett 24

在Qt中,为编译时选项定义了以下OS宏

// pre 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类在运行时为您提供操作系统版本和其他选项.


Ale*_*lke 22

实际上,操作系统是由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
Run Code Online (Sandbox Code Playgroud)

窗口系统定义如下:

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
Run Code Online (Sandbox Code Playgroud)

使用#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
Run Code Online (Sandbox Code Playgroud)

  • 不知道为什么这是接受的答案,因为OP询问**运行时**,这涵盖**编译时间**. (5认同)
  • 因此,您试图告诉您的是,绝对不需要确定实际在其上启动代码的机器的OS特定细节?想象一下一个简单的工具,该工具用于向用户显示有关其操作系统和环境的所有可用信息。并提供一个示例,说明如何使用`Qt`和`#ifdef`指令实现此目标。至少对于CPU体系结构。 (2认同)

Tro*_*our 11

Qt提供QSysInfo,如果你真的需要在运行时获得它.有用于附加崩溃报告,但有任何其他尝试在编译时执行此操作.


Vit*_*kas 7

由于没有定义Qt5宏Q_WS_*!

您应该使用Q_OS_*宏来代替:

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
Run Code Online (Sandbox Code Playgroud)

QtGlobal文档中的更多细节


Tra*_*oud 6

大多数这些答案提供了确定所需要的信息在解决方案编译的时候,当你的应用程序被编译在你的开发机.

以下是在运行时,当您的应用程序的用户在计算机上运行您的应用程序,如何获取所需信息.

qDebug() << "currentCpuArchitecture():" << QSysInfo::currentCpuArchitecture();
qDebug() << "productType():" << QSysInfo::productType();
qDebug() << "productVersion():" << QSysInfo::productVersion();
qDebug() << "prettyProductName():" << QSysInfo::prettyProductName();
Run Code Online (Sandbox Code Playgroud)

典型结果:

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)"
Run Code Online (Sandbox Code Playgroud)

文档QSysInfo在这里.