【问题标题】:How does Qt manage to use main() for non-console applications in Windows?Qt 如何设法将 main() 用于 Windows 中的非控制台应用程序?
【发布时间】:2015-01-27 00:27:14
【问题描述】:

正如微软自己解释的那样,控制台程序使用main(),但非控制台Win32 程序使用WinMain() 作为入口点。事实上,在 Visual Studio 的 Win32 项目中使用main() 会导致链接器错误。

但是在 Qt 项目中,无论是从 Qt Creator 还是 Visual Studio 创建的,GUI 程序都使用main(),就像控制台程序一样。 Qt 的人是怎么做到的?

【问题讨论】:

  • 您可以在此处阅读有关差异的更多信息:stackoverflow.com/questions/13871617/…
  • 这只是二进制可执行文件中的寻址问题。如果编译到正确的地址,main() 函数将始终有效。

标签: c++ windows qt


【解决方案1】:

Qt 使用WinMain() defined in qtbase/src/winmain/qtmain_win.cpp,随后calls 我们的“虚构”int main(int argc, char *argv[])

附:您可以通过在调试器中设置断点并查看调用堆栈来找出这种技巧。在 Visual Studio 中:Menu "Debug" -> Windows -> Call Stack

【讨论】:

  • 其实我记得经常看到main/WinMain()下面的函数,只是没注意过而已。所以他们在 Qt 本身中定义了 WinMain() ,对吗?如果他们使用 CRT,这将是有道理的,因为 CRT 会先运行,并且它会期待 WinMain()。
【解决方案2】:

问题出在您链接的库中。mainWinMain 都不是 Windows 的入口点。真正的入口点在 CRT 库中。真正的入口点调用您的mainWinMain。这对于一些 pre-main CRT 初始化是必要的

如果您有 Qt 库,它也有类似的早期初始化需求并执行类似的技巧。您现在拥有 CRT 和 Qt 库,但我认为 CRT 仍然是第一个,然后是 Qt,最后是您的 main

【讨论】:

    猜你喜欢
    • 2011-09-08
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-07
    相关资源
    最近更新 更多