web-dev-qa-db-fra.com

Obtenir le système d'exploitation actuel pendant l'exécution en C++

Je dois déterminer le système d'exploitation sur lequel mon programme est exécuté pendant l'exécution.

J'utilise Qt 4.6.2, MinGW et Eclipse avec CDT. Mon programme doit exécuter un processus QProcess sous Windows ou Linux. Maintenant, j'ai besoin d'une sorte de commutateur pour exécuter le code différent en fonction du système d'exploitation.

THX

21
Kai Walz

En réalité, le système d'exploitation est défini par les macros Q_OS _... Je dis juste. Les Q_WS _... sont un système de fenêtrage. Pas exactement pareil. (Je viens de lire ce que l'auteur de la question a écrit ... "système d'exploitation".)

Ces déclarations se trouvent dans le fichier 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

Les définitions du système de fenêtre sont comme ceci:

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

L'un des principaux problèmes avec #ifdef est de s'assurer que si vous compilez sur une "nouvelle" plate-forme (jamais compilé ce logiciel sur cette plate-forme), vous voulez utiliser #Elif defined(...) et au moins un #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

Dans Qt, les macros de système d'exploitation suivantes sont définies pour les options de compilation.

// pre Qt5 Qt/X11 = Q_WS_X11 est défini.
Qt/Windows = Q_WS_WIN est défini.
Qt/Mac OS X = Q_WS_MACX est défini

// à partir de Qt5, Qt/X11 = Q_OS_X11 est défini.
Qt/Windows = Q_OS_WIN est défini.
Qt/Mac OS X = Q_OS_MACX est défini

Ensuite, la classe QSysInfo vous donne la version du système d’exploitation et d’autres options au moment de l’exécution.

24
Martin Beckett

Qt propose QSysInfo si vous avez vraiment besoin de savoir cela au moment de l'exécution. Utile pour ajouter un rapport d'erreur mais pour toute autre chose, essayez de le faire au moment de la compilation.

10
Troubadour

Puisque les macroses Qt5, Q_WS_ * ne sont pas définis!

Vous devriez utiliser Q_OS_ * macroses à la place:

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

Plus de détails dans la documentation de QtGlobal

7

La plupart de ces réponses fournissent des solutions pour déterminer les informations requises à un moment {compiler}, lorsque votre application est en cours de compilation sur la votre machine de développement.

Voici comment vous obtenez les informations requises pendant runtime, lorsque votre application est exécutée par les utilisateurs de votre application sur les machines leurs.

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

Résultat typique:

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)"

La documentation pour QSysInfo est ici .

6
TranslucentCloud

Faites-le à la compilation en utilisant #ifdef.

Sous Windows, WIN32 est défini.

Alors faites:

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

Cela se fait généralement à l'aide de directives de précompilateur pour contrôler quelle partie du code est incluse/exclue de votre construction.

#ifdef WIN32
  // ...
#endif

Il en résulte (sans doute) un code plus laid, mais des fichiers binaires ciblés.

1
Alex

for runtime QGuiApplication :: platformName ()

Ceci distingue plus précisément, par exemple, "eglfs" ou "directfb"

1
kaegoorn48

À partir de Qt 5.9, certaines méthodes de QSysInfo ont été amorties, telles que QSysInfo::windowsVersion().

Une classe alternative pour une telle fonctionnalité commençant à Qt 5.9 est QOperatingSystemVersion

exemple

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