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
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
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.
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.
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
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 .
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
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.
for runtime QGuiApplication :: platformName ()
Ceci distingue plus précisément, par exemple, "eglfs" ou "directfb"
À 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() );