Win32,WinMain vs自定义入口点(巨大的差异),为什么?

时间:2017-02-06 02:36:15

标签: c winapi

正如话题所说。

我注意到如果我使用WinMain或任何其他默认入口点,C应用程序可能像70kb。

但是,如果我只是指定一个自定义入口点,请说" RawMain",int RawMain()。 然后该文件将像6kb。

所以我想知道,为什么这个,它添加/引用文件是什么? 我可以理解大小有一些小的差异,但对于空的应用程序来说差异很大。

谢谢!

1 个答案:

答案 0 :(得分:3)

在大多数环境中构建Windows时,实际程序入口点将由小型运行时库中的函数提供。这将做一些环境准备,然后调用你提供的函数,如main,wmain,WinMain等。

在用户提供的main函数之前运行的代码包括运行全局C ++构造函数,启用TLS变量,初始化全局互斥锁,以便标准库调用在多线程环境中正常工作,设置标准语言环境以及其他内容。

设置入口点的一件事是使用带有入口点名称的未定义符号启动链接器,因此,例如,如果您使用mingw32,链接器将开始假设它需要链接{ {1}}以及未定义的符号libmingw32.a

链接器将在__tmainCRTStartup中找到(希望)__tmainCRTStartup,并包含包含它的目标文件libmingw32.a,以及满足{{1}发出的未定义符号所需的任何其他内容这是额外大小的来源。

当您设置自己的入口点时,可以覆盖它,只需设置链接器以查找您指定的任何函数。你得到一个较小的可执行文件,但是你必须要小心你正在使用的功能不依赖于运行时启动函数所做的任何全局初始化。