web-dev-qa-db-ja.com

C ++で実行時に現在のオペレーティングシステムを取得する

実行時にプログラムが実行されているオペレーティングシステムを把握する必要があります。

Qt 4.6.2、MinGW、EclipseとCDTを使用しています。私のプログラムは、WindowsまたはLinuxでコマンドラインQProcessを実行します。ここで、オペレーティングシステムに応じて異なるコードを実行するための一種のスイッチが必要です。

どうも

22
Kai Walz

実際、オペレーティングシステムは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の使用に関する主な問題の1つは、「新しい」プラットフォームでコンパイルする場合(そのプラットフォームでそのソフトウェアをコンパイルしたことがない場合)、#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
_
22
Alexis Wilke

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 クラスは、実行時にOSバージョンとその他のオプションを提供します。

24
Martin Beckett

Qtは、実行時にこれを実際に取得する必要がある場合、 QSysInfo を提供します。クラッシュレポートに追加する場合に便利ですが、それ以外の場合はコンパイル時に追加してみてください。

11
Troubadour

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

QtGlobal のドキュメントの詳細

7

これらの回答のほとんどは、アプリがyour開発マシンでコンパイルされているときに、compile時に必要な情報を決定するためのソリューションを提供します。

runtimeの間に、アプリのユーザーがtheirマシンでアプリを実行しているときに、必要な情報を取得する方法は次のとおりです。

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のドキュメントは ここ です。

6

#ifdefを使用してコンパイル時に実行します。

Windowsでは、WIN32が定義されています。

だから、行う:

#ifdef WIN32
// Windows code here
#else
// UNIX code here
#endif
3
houbysoft

ランタイムの場合 QGuiApplication :: platformName()

これにより、たとえば「eglfs」や「directfb」をより正確に区別できます。

2
kaegoorn48

これは通常、プリコンパイラディレクティブを使用して実行され、ビルドに含まれる/ビルドから除外されるコードのチャンクを制御します。

#ifdef WIN32
  // ...
#endif

これにより、(おそらく)醜いコードになりますが、バイナリがターゲットになります。

1
Alex

Qt 5.9以降、QSysInfo::windowsVersion()などのQSysInfoの一部のメソッドが減価償却されました。

Qt5.9以降のこのような機能の代替クラスはQOperatingSystemVersionです。

bool onWindows = ( QOperatingSystemVersion::Windows == QOperatingSystemVersion::currentType() );
1
infixed