Получить текущую операционную систему во время выполнения в C ++ - PullRequest
22 голосов
/ 17 июня 2010

Мне нужно выяснить, в какой операционной системе работает моя программа во время выполнения.

Я использую Qt 4.6.2, MinGW и Eclipse с CDT. Моя программа должна запускать командную строку QProcess в Windows или Linux. Теперь мне нужен вид переключателя для запуска другого кода в зависимости от операционной системы.

Thx

Ответы [ 9 ]

24 голосов
/ 17 июня 2010

В Qt определены следующие макросы ОС для опций времени компиляции

// 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 предоставляет вам версию ОС и другие параметры во время выполнения.

22 голосов
/ 19 декабря 2011

На самом деле операционная система определяется макросами 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
11 голосов
/ 17 июня 2010

Qt предлагает QSysInfo , если вам действительно нужно это сделать во время выполнения.Полезно для добавления в отчет о сбое, но для чего-либо еще попробуйте сделать это во время компиляции.

7 голосов
/ 15 мая 2014

Поскольку макросы 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

6 голосов
/ 24 сентября 2016

Большинство из этих ответов предоставляют решения для определения необходимой информации во время компиляции , когда ваше приложение компилируется на вашей машине разработки.

Вот как вы получаете необходимую информацию во время выполнения , когда ваше приложение запускается пользователями вашего приложения на их компьютерах.

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 здесь .

3 голосов
/ 17 июня 2010

Сделайте это во время компиляции, используя # ifdef.

Под окнами определяется WIN32.

Итак, сделайте:

#ifdef WIN32
// Windows code here
#else
// UNIX code here
#endif
2 голосов
/ 20 сентября 2014

для времени выполнения QGuiApplication :: platformName ()

Это более точно различает, например, "eglfs" или "directfb"

1 голос
/ 17 июня 2010

Обычно это делается с использованием директив прекомпилятора для управления тем, какой фрагмент кода включен / исключен из вашей сборки.

#ifdef WIN32
  // ...
#endif

В результате получается (возможно) более уродливый код, но целевые двоичные файлы.

0 голосов
/ 14 мая 2018

Начиная с Qt 5.9, некоторые методы QSysInfo устарели, такие как QSysInfo::windowsVersion()

Альтернативный класс для такой функциональности, начиная с Qt 5.9: QOperatingSystemVersion

пример

bool onWindows = ( QOperatingSystemVersion::Windows == QOperatingSystemVersion::currentType() );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...