【问题标题】:Cross Platform Entry Function That Doesn't Show Console不显示控制台的跨平台进入功能
【发布时间】:2012-11-02 12:00:40
【问题描述】:

我正在使用跨平台 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 程序可以在任何操作系统上运行,这实际上是不可能的。是这样吗?

【问题讨论】:

  • 你试过编译和运行这个basic example吗?如果它不像他们说的那样工作,那么提交一个错误。

标签: c++ cross-platform entry-point fltk


【解决方案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 库的用途。

【讨论】:

    【解决方案2】:

    查看链接器选项。链接器控制您的程序的可执行文件类型。
    拥有多个main 函数也是一种选择。 #ifdef 可以控制每个平台使用哪一个。

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

    这是不可能的

    【讨论】:

    • 我过去曾在没有WinMain 的情况下将 FLTK 用于 Windows/Linux,在 Linux 上使用 gcc,在 Windows 上使用 mingw。使用 mingw for Windows,我很确定您不需要设置任何选项来使其成为窗口应用程序,我认为这是默认设置。
    【解决方案3】:

    *NIX 系统默认不应生成终端窗口,因此您可能只需要在 Windows 上执行一些特殊操作。

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

    但是,我强烈建议尽可能避免使用宽字符 (wchar_t),因为它们因平台而异,并通过内部将所有字符串存储为来处理需要它们的特定于平台的 API 调用,例如 UTF-8,将它们转换(例如通过 MultiByteToWideChar)仅用于进行 API 调用。

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

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

    【讨论】:

    • 明白了。如果不可能在任何操作系统上运行相同的程序,那为什么还要有跨平台库呢?
    • @ForgiveMeI'mAN00b 这样您就可以在所有平台上编译相同的代码。没有人喜欢维护 100 多个代码树...
    猜你喜欢
    • 2021-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-13
    • 1970-01-01
    相关资源
    最近更新 更多