2010-06-17 53 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

相關問題