Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Кроссплатформенный C/C++: cl/gcc/Qt/Gtk+/WxWidgets > Отличить Windows от Linux.


Автор: Сергей85 20.06.17, 16:16
Программа может запускаться в одной из двух ОС. Нужна функция или алгоритм определения запущенной ОС.

Автор: shm 20.06.17, 16:18
Q_OS_WIN
Q_OS_LINUX

Автор: JoeUser 20.06.17, 16:53
Цитата shm @
Q_OS_WIN
Q_OS_LINUX

Это "подсказки" компилятору какие куски кода использовать под целевую систему - это не определение. Определять можно так:

1) попробовать запустить команду VER, если успешно - значит получишь версию венды
2) попробовать запустить команду uname -a, если успешно - значит получишь версию *nix
3) а можно забыть про первые два пункта и заюзать QSysInfo

Автор: shm 20.06.17, 17:07
Цитата JoeUser @
это не определение

Шо значит не определение?
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    #ifdef Q_OS_WIN
    std::cout << "Windows";
    #endif

Автор: _lcf_ 20.06.17, 19:54
ну, наверное, имелось ввиду чтоб прям версия системы определялась. но в общем это нафиг нужно. как правило:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    #ifdef _WIN32

Автор: JoeUser 21.06.17, 05:27
Цитата shm @
Шо значит не определение?

Это указание на целевую платформу в compile-time. Челу же нужно определение в рантайме. Вот пример. Допустим таки удастя запустить линух прогу под вендой. Тогда такая линух-программа будет бодрячком рапортовать "я работаю под линухом", а это неверно. В рантайме с помощью QSysInfo - должно быть все ровно.

Автор: VisualProg 21.06.17, 06:16
Цитата _lcf_ @
как правило:

"_WIN32" "_WIN64"

в MinGW и g++ есть ещё такая штука как "__linux__"

Добавлено
Цитата JoeUser @
указание на целевую платформу в compile-time

Вот такого я не умею :o
Это получается, один и тот же собранный файл, например *.exe будет исполняемым (и соответственно полноценно работать) и на Win и на Linux одновременно?

Автор: ter_nk_ 21.06.17, 06:54
Цитата VisualProg @
Это получается, один и тот же собранный файл, например *.exe будет исполняемым (и соответственно полноценно работать) и на Win и на Linux одновременно?


Это невозможно. Допустим есть два исполняемых файла, все равно надо понять какой запускать.

Автор: shm 21.06.17, 07:41
Цитата JoeUser @
Челу же нужно определение в рантайме.

С чего ты взял?

Автор: _lcf_ 21.06.17, 07:54
хм, а что, в процессе выполнения система может изменится? :)

Автор: shm 21.06.17, 07:58
JoeUser рассматривает какой-то высосаный из пальца случай, когда прога запускается под эмулятором окружения ОС. К слову, я не уверен, что в этом случае
Цитата JoeUser @
QSysInfo - должно быть все ровно.

Автор: OpenGL 21.06.17, 08:01
Цитата JoeUser @
Это указание на целевую платформу в compile-time. Челу же нужно определение в рантайме.

Во-первых, это нигде не сказано. Во-вторых, что мешает написать так?
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    std::string os_name()
    {
    #ifdef Q_OS_WIN
        return "Windows";
    #else
        return "Linux";
    #endif
    }

Автор: JoeUser 21.06.17, 08:10
Цитата shm @
С чего ты взял?

Так ясно же написано:

Программа может запускаться в одной из двух ОС. Нужна функция или алгоритм определения запущенной ОС.
Не компилятор и линкер, а программа. Значит рантайм.

Автор: shm 21.06.17, 08:15
Цитата JoeUser @
Так ясно же написано:

Не ясно совершенно :no: Учитывая еще (по соседним темам), что Сергей85 не умеет формулировать вопросы. Более того, я не сомневаюсь, что запускаются разные сборки.

Автор: Cfon 21.06.17, 08:20
коллега все это надо делать на этапе компиляции :D

Автор: VisualProg 21.06.17, 08:55
Цитата ter_nk_ @
Это невозможно. Допустим есть два исполняемых файла, все равно надо понять какой запускать.

Нет, я имею ввиду реально кросспатформу, чтобы прямо elf и exe и всё в одном флаконе, например, как *.jar/*.jad. Про два файла - это не интересно.
Цитата JoeUser @
Программа может запускаться в одной из двух ОС. Нужна функция или алгоритм определения запущенной ОС.
Не компилятор и линкер, а программа. Значит рантайм.


Тогда не понятен смысл проверки ОС в реалтайме. Это же бессмысленно, с учётом того что со слов ter_nk_ ясно что на одной конкретной ОС будет одна конкретная сборка приложения)

Автор: JoeUser 21.06.17, 14:02
Цитата VisualProg @
Тогда не понятен смысл проверки ОС в реалтайме

Версий операционных систем - море. Каждая обладает рядом уникальных для нее одной свойствами. Часто это не важно, но не всегда.

Автор: VisualProg 21.06.17, 14:35
Цитата JoeUser @
Версий

Нет, ТС дал ясно понять что его интересуют две ОС - Windows и Linux, промежуточные версии каждой из них его не интересуют.

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)