Я использую кроссплатформенную библиотеку графического интерфейса (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
Программа работает на любой ОС, а это на самом деле невозможно. Это так?
* Системы NIX не должны порождать окна терминала по умолчанию, поэтому вам, вероятно, придется делать что-то особенное только в Windows.
Если вы можете обернуть функцию WinMain, то есть положить #define
охраняет его и вызывает другую функцию, которая действует как «настоящая» main
внутри него, а затем вызвать эту функцию из main
на других платформах не должно быть серьезных проблем.
тем не мение, Я настоятельно рекомендую избегать широких символов (wchar_t
) когда это возможно, потому что они различаются от платформы к платформе и обрабатывают вызовы API для конкретной платформы, которые в них нуждаются, путем внутреннего хранения всех строк, например, UTF-8, их преобразования (например, с помощью MultiByteToWideChar) только для вызова API.
В основном, для платформ, отличных от Windows, необходимо использовать стандарт main
Windows вам понадобится WinMain
, Сделайте так, чтобы они оба вызывали третью функцию, которая обрабатывает то, что должна и возвращает ваша основная функция.
Кроме того, любой бинарный файл Windows PE (файл .exe) будет работать только в Windows. Вы должны будете скомпилировать свою программу для каждой платформы отдельно, независимо от того, что вы делаете.
Посмотрите на параметры компоновщика. Линкер контролирует, какой будет исполняемый файл вашей программы.
Наличие нескольких main
функции также вариант. #ifdef
может контролировать, какой из них будет использоваться для каждой платформы.
возможно, я полностью заблуждаюсь о возможности работать с одной и той же программой .exe на любой ОС
это невозможно
Это старый вопрос, но я только что нашел его и думаю, что он полезен, я последовал совету 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.