【问题标题】:Visual Studio keeps using wWinMain() as the entry point instead of the main() function I want it toVisual Studio 一直使用 wWinMain() 作为入口点,而不是我想要的 main() 函数
【发布时间】:2022-07-23 22:31:45
【问题描述】:

我将我的 Visual Studio 项目作为一个 Windows 应用程序开始,但是我开始意识到如果我想使用 GLFW,那么我应该打开一个 GLFW 窗口而不是标准的 wWinMain 窗口。我有一个 wWinMain 函数,但由于每次运行程序时它都在运行,而不是我的 int main() 函数和 GLFW 窗口测试代码,我更改了 wWinMain 函数的名称,希望在构建程序时它会延迟到我写的 main() 函数。但是它没有用,而是我不断收到相同的错误:

error LNK2019: unresolved external symbol WinMain referenced in function "int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ)

如何让它停止寻找 wWinMain 函数而只运行 main() 函数?

到目前为止唯一有效的解决方案是将我的 main() 函数重命名为 wWinMain 并让它接受所有变量,但对它们不做任何事情,只是在内部正常运行我的代码,但这似乎不是最优的。

我也尝试过建议here 的答案,但它总是会打开一个带有 GLFW 窗口的命令窗口,而默认情况下 wWinMain 函数会在没有命令窗口的情况下运行,除非我专门使用 AllocConsole(),所以我怀疑答案建议实际上没有针对我的问题的正确解决方案。

我也尝试了here 显示的解决方案,但这对我不起作用? idk 也许我执行错了

【问题讨论】:

  • wWinMain 不必创建任何 WIN32 窗口。如果它这样做了,那么其中必须有一些代码可以做到这一点,你可以把它拿出来。然后做你想到的任何 GLFW 魔法。
  • @PaulSanders 不我知道为什么 wWinMain 正在打开控制台(我在 wWinMain 函数中有一个 AllocConsole 调用),问题是即使 wWinMain 没有被调用 i> 我认为这表明该解决方案或我的实施存在一些问题
  • 听起来您需要创建“Windows 桌面应用程序”项目而不是“控制台应用程序”项目。

标签: c++ visual-studio winapi glfw


【解决方案1】:

Windows 知道两种与您相关的程序:控制台程序和图形程序。

控制台程序会自动获得一个控制台(例如,您可以在命令行中获得它们的输出),它们的入口点是mainwmain

图形程序不会自动获得控制台,而这正是您想要的。它们也不会自动创建任何窗口。您必须手动执行此操作(即像您想要的那样使用 GLFW)。他们的入口点是总是 WinMainwWinMain

你必须选择一个,你不能混搭。只需将您的 GLFW 代码放入 wWinMainmain 在图形化的 Windows 程序中没有意义,你应该删除它。不使用传递给wWinMain 的参数并没有错——如果你不需要它们,那很好。 main 也接受您当前不使用的参数(但 main 有点特别,因为您可以省略未使用的参数)。

【讨论】:

【解决方案2】:

main 或 winMain 的选择由项目的链接器部分控制

  • 子系统 = 控制台意味着主系统
  • 子系统 = windows 意味着 winmain

【讨论】:

  • 当然,您获得的是常规入口点还是w 版本取决于您选择的是Ansi 字符集还是Unicode。我绝对推荐 Unicode。
【解决方案3】:

我会添加

int WinMain() {
    return main();
}

在您的 main() 函数之后。这样,如果您在 Windows 子系统和 Console 子系统之间切换,它将双向工作。

【讨论】:

    猜你喜欢
    • 2021-06-14
    • 1970-01-01
    • 1970-01-01
    • 2016-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-24
    • 2019-06-16
    相关资源
    最近更新 更多