Кроссплатформенная функция ввода, которая не показывает консоль

Я использую кроссплатформенную библиотеку графического интерфейса (FLTK) для создания некоторого графического интерфейса, я не использую Win32 API. Я хочу, чтобы эта программа работала на Windows, Linux и Mac OS.

Я не понимаю как кроссплатформенный Mumbo Jumbo работает (посмотрите имя моей учетной записи),
но я думаю понимаю какие это значит быть кроссплатформенным. Но это не мой вопрос.

Моя проблема в том, что моя функция входа сейчас просто int main (),
но когда я использую эту функцию ввода, выскакивает консоль. Я не хочу никаких консолей,
так что я знаю, что я мог бы сделать мою функцию входа следующим образом:

int wWinMain(HINSTANCE hInst, HINSTANCE hPreInst, LPWSTR nCmdLine, int nCmdShow)

и не было бы консоли.

Я боюсь, что, поскольку я должен использовать Win32 API, чтобы иметь эту функцию ввода wWinMain (из-за HINSTANCE и LPWSTR), программа больше не будет совместима с другими ОС.

Поэтому мой вопрос: будет ли моя программа работать на Mac и Linux, если я использую функцию wWinMain? Если нет, есть ли функция, которую я Можно использовать, что не создает консоли и будет работать на всех ОС?

Наконец, возможно, я полностью заблуждаюсь о возможности иметь тот же .exe
Программа работает на любой ОС, а это на самом деле невозможно. Это так?

2

Решение

* Системы NIX не должны порождать окна терминала по умолчанию, поэтому вам, вероятно, придется делать что-то особенное только в Windows.

Если вы можете обернуть функцию WinMain, то есть положить #define охраняет его и вызывает другую функцию, которая действует как «настоящая» main внутри него, а затем вызвать эту функцию из main на других платформах не должно быть серьезных проблем.

тем не мение, Я настоятельно рекомендую избегать широких символов (wchar_t) когда это возможно, потому что они различаются от платформы к платформе и обрабатывают вызовы API для конкретной платформы, которые в них нуждаются, путем внутреннего хранения всех строк, например, UTF-8, их преобразования (например, с помощью MultiByteToWideChar) только для вызова API.

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

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

1

Другие решения

Посмотрите на параметры компоновщика. Линкер контролирует, какой будет исполняемый файл вашей программы.
Наличие нескольких main функции также вариант. #ifdefможет контролировать, какой из них будет использоваться для каждой платформы.

возможно, я полностью заблуждаюсь о возможности работать с одной и той же программой .exe на любой ОС

это невозможно

1

Это старый вопрос, но я только что нашел его и думаю, что он полезен, я последовал совету user308323 и выдвинул его, который прекрасно работает, когда я определяю WIN32 как определение препроцессора в проекте Visual Studio.

#ifdef WIN32
int wWinMain(HINSTANCE hInst, HINSTANCE hPreInst, LPWSTR nCmdLine, int nCmdShow)
#endif
#ifndef WIN32
int main(int argc, char **argv)
#endif

{
Model model;
UIController controller(model);

controller.run(NULL, NULL);
}

Заметьте, что я только изменил сигнатуру функции и отправляю null как аргументы argc и argv, они нам все равно не понадобятся, потому что это не программа командной строки

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

0
По вопросам рекламы [email protected]