Подтвердить что ты не робот

Получить текущую операционную систему во время выполнения в С++

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

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

спасибо

4b9b3361

Ответ 1

Фактически операционная система определяется макросами 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

Ответ 2

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

Ответ 3

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

Ответ 4

Так как макросы 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

Ответ 5

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

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

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.

В окнах определяется WIN32.

Итак, do:

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

Ответ 7

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

#ifdef WIN32
  // ...
#endif

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

Ответ 8

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

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