正如主题所说。
我注意到,如果我使用 WinMain 或任何其他默认入口点,C 应用程序可能约为 70kb。
但是如果我只是指定一个自定义入口点,比如“RawMain”,int RawMain()。 那么文件大约是6kb。
所以我想知道这是为什么,它添加/引用了文件什么? 我可以理解尺寸上存在一些微小差异,但对于空应用程序来说差异巨大。
谢谢!
最佳答案
在大多数环境中为 Windows 构建时,实际的程序入口点将由小型运行时库中的函数提供。那会做一些环境准备,然后调用你提供的一个函数,比如main、wmain、WinMain等。
在用户提供的 main 函数之前运行的代码包括运行全局 C++ 构造函数、启用 TLS 变量、初始化全局互斥体以便标准库调用在多线程环境中正常工作、设置标准区域设置以及其他内容。
设置入口点所做的一件事是使用 undefined symbol 和您为入口点指定的名称启动链接器,因此,例如,如果您使用 mingw32,链接器将开始假设它需要链接 libmingw32.a
并带有 undefined symbol __tmainCRTStartup
。
链接器将在 libmingw32.a
中找到(希望)__tmainCRTStartup
,并包含包含它的目标文件 crtexe.o
以及以及满足来自 crtexe.o
的 undefined symbol 所需的任何其他内容,这就是额外大小的来源。
当您设置自己的入口点时,您可以覆盖它,并且只需设置链接器来查找您指定的任何函数。您将获得较小的可执行文件,但必须小心,您使用的功能不依赖于运行时的启动函数完成的任何全局初始化。
关于c - Win32、WinMain 与自定义入口点(大小差异巨大),为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42059629/