Qt在Windows下如何实现非控制台应用程序使用main()函数?

3

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

但是在 Qt 项目中,无论是从 Qt Creator 还是 Visual Studio 创建,GUI 程序像控制台程序一样使用 main()。Qt 的开发人员是如何做到这一点的呢?


1
你可以在这里阅读更多关于它们之间的区别:https://dev59.com/aWYr5IYBdhLWcg3wM3j6。 - vahancho
这只是在二进制可执行文件中寻址的问题。如果编译到正确的地址,main()函数将始终起作用。 - Sebastian Lange
2个回答

6
Qt利用qtbase/src/winmain/qtmain_win.cpp中定义的WinMain(),随后调用我们“虚构”的int main(int argc, char *argv[])
附注:您可以通过在调试器中设置断点并查看调用堆栈来找出这种技巧。在Visual Studio中:菜单“调试”->窗口->调用堆栈

实际上,我记得经常看到在main/WinMain()之下的函数,只是从来没有注意过它们。所以它们在Qt本身定义WinMain(),对吗?如果它们使用CRT,这是有道理的,因为CRT将首先运行,并期望WinMain()。 - sashoalm

1
问题在于你链接的库。无论是 main 还是 WinMain 都不是 Windows 的入口点,真正的入口点在 CRT 库内部。那个真正的入口点会调用你的 main 或者 WinMain。这对于一些预主函数 CRT 初始化是必要的。
如果你使用 Qt 库,它也有类似早期初始化的需求,并执行类似的技巧。现在你同时具有 CRT 和 Qt 库,但我认为 CRT 仍然排在第一位,然后是 Qt,最后是你的 main

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接