2

我正在使用跨平台 GUI 库 (FLTK) 来制作一些 GUI,我没有使用 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),所以该程序将不再与其他操作系统兼容。

所以我的问题是,如果我使用 wWinMain 函数,我的程序能否在 Mac 和 Linux 操作系统上运行?如果没有,是否有一个我可以使用的功能不创建控制台并且可以在所有操作系统上运行?

最后,也许我完全幻想能够在任何操作系统上运行相同的 .exe 程序,这实际上是不可能的。是这样吗?

4

3 回答 3

1

*NIX 系统默认不应该产生终端窗口,所以你可能只需要在 Windows 上做一些特殊的事情。

如果您可以包装 WinMain 函数,即#define在其周围放置防护并调用另一个充当其main内部“真实”的函数,然后从main其他平台调用该函数,则应该没有大问题。

但是,我强烈建议wchar_t尽可能避免使用宽字符(通过MultiByteToWideChar)仅用于进行 API 调用。

基本上,非 Windows 平台需要你使用标准main功能,Windows 需要你使用WinMain. 让他们都调用第三个函数来处理你的主函数应该和返回的内容。

此外,任何 Windows PE 二进制文件(.exe 文件)都只能在 Windows 上运行。无论您做什么,都必须为每个平台分别编译程序。

于 2012-11-14T00:46:49.110 回答
1

看看链接器选项。链接器控制您的程序将是哪种可执行文件。
具有多种main功能也是一种选择。#ifdef可以控制每个平台使用哪一个。

也许我完全幻想能够在任何操作系统上运行相同的 .exe 程序

这是不可能的

于 2012-11-14T00:47:27.357 回答
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 库的用途。

于 2017-12-12T18:08:16.800 回答