Microsoft 编译器和 GNU 编译器在输出可执行文件大小方面的差异
假设我有以下程序:
#include <stdio.h>
int main()
{
printf("This is a sample C program.\n");
return 0;
}
如果我在 Windows 7 32 位机器上使用 Microsoft 编译器(cl.exe /O1 example.c
)编译它,那么它会输出一个 44 位的可执行文件知识库。
如果我在 CentOS 64 位机器上使用 GNU 编译器 (gcc example.c
) 编译它,那么它会输出一个 6 KB 的可执行文件。
一般来说,为什么这个小程序的文件大小会有这么大的差异呢?为什么 Windows 仅打印一行并退出就需要 44 KB?
Suppose I have the following program:
#include <stdio.h>
int main()
{
printf("This is a sample C program.\n");
return 0;
}
If I compile it with the Microsoft compiler (cl.exe /O1 sample.c
) on a Windows 7 32-bit machine, then it outputs an executable file that is 44 KB.
If I compile it with the GNU compiler (gcc sample.c
) on a CentOS 64-bit machine, then it outputs an executable file that is 6 KB.
Generally speaking, why is there such a big difference in file size for this small program? Why does it take Windows 44 KB just to print a line and exit?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
如果您将 /MD 开关与 cl.exe 一起使用,它将动态链接到 msvcrt(Microsoft C 运行时库)并使用 msvcrt.dll(您将获得类似的 6KB 可执行文件大小),否则来自 C 的代码库静态链接到可执行文件中,增加了可执行文件的大小。
默认情况下,CentOS 上的 gcc 编译器设置为动态链接 C 库。
If you use the /MD switch with cl.exe, it will dynamically link against msvcrt (the Microsoft C runtime library) and use the msvcrt.dll (and you will get a comparable executable size of 6KB), otherwise the code from the C library is statically linked into your executable increasing the size of the executable.
Your gcc compiler on CentOS is setup to dynamically link against the C library by default.
除了上面提供的链接之外,我觉得这也将帮助您了解发生的情况当我们使用 gcc 编译时!
Apart from the links provided above, I feel this will also help you to understand on what happens when we compile using gcc!