这是至少两个紧密相关但截然不同的问题系列的一部分。我希望我通过分别询问他们来做正确的事。

我正在尝试使我的Visual C ++ 2008应用程序在没有C运行时库的情况下工作。这是一个Win32 GUI应用程序,没有MFC或其他有趣的东西,只是普通的Windows API。

因此,我将项目属性->配置-> C / C ++->高级->省略默认库名称设置为是(编译器标志/Zl)并重建。

然后,链接器抱怨未解析的外部_WinMainCRTStartup。公平地说,我可以告诉链接器使用其他入口点,例如MyStartup。从我在网络上收集的信息来看,_WinMainCRTStartup做一些初始化工作,我可能希望MyStartup做一些初始化工作。

所以我的问题是:_WinMainCRTStartup可以执行哪些功能,如果不使用CRT,可以忽略哪些功能?

如果您对这方面的知识很了解,请也参阅my other question。谢谢!

旁白:为什么我首先要这样做?


我的应用程序未明确使用任何CRT功能。
我喜欢精益和卑鄙的应用程序。
它会教我一些新东西。

最佳答案

CRT的入口点执行以下操作(此列表不完整):


初始化CRT所需的全局状态。如果不这样做,则不能使用CRT提供的任何功能或状态。
初始化编译器使用的某些全局状态。 / GS使用的安全性cookie之类的运行时检查肯定在这里很突出。但是,您可以自己呼叫__security_init_cookie。您可能需要添加其他代码以进行其他运行时检查。
在C ++对象上调用构造函数。如果您正在编写C ++代码,则可能需要模仿。
检索命令行并启动操作系统提供的信息,并将其传递给您的主要用户。默认情况下,操作系统不会将任何参数传递给程序的入口点-它们都由CRT提供。


CRT源代码随Visual Studio提供,您可以在调试器中逐步浏览CRT的入口点,并确切地了解它在做什么。

关于visual-c++ - _WinMainCRTStartup执行什么功能?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1583193/

10-11 22:54