我有一个用 C 语言编写的程序,我在 Windows 7 笔记本电脑和 Ubuntu 虚拟机上编译了该程序。我使用的编译器是 GCC,但在 Windows 7 上我下载了 MinGW。
编译完程序后,我检查了它们的文件大小,发现 Windows 上的 .exe
比 Ubuntu 上的要大得多。
对于 Windows,我得到的文件大小为 69,280
字节,但在 Ubuntu 上,我得到的文件大小仅为 8,703
字节。
这是怎么回事?
最佳答案
无论您使用哪种 native 运行时(MinGW 或 mingw-w64),您都会遇到这种膨胀。这是因为 Windows 可执行文件链接到静态库,而 Ubuntu 上的 GCC 链接到共享库(如果您是 Windows 人员,则为 .dll
文件;如果您是 *nix 人员,则为 .so
文件;如果您是 *nix 人员,则为 .dylib
文件。如果您是 OS X 用户)。
我刚刚使用一个非常小的 C 程序测试了 Cygwin64 与 mingw-w64(甚至没有任何 header ,因为有些可能会用自己的调用函数的宏替换您的函数调用),包括调试信息,并且没有优化,Cygwin 来了文件大小获胜者为 67024 字节与 132206 字节。优化文件大小并删除所有符号,差异仍然有利于 Cygwin:8.5 KiB 与 15.5 KiB。值得一提的是,两者都是在 64 位模式下编译的。
这可能部分是由于需要静态库(mingw-w64 通常使用静态链接)与共享库/dll
文件(Cygwin 似乎通常使用动态链接)。在 Ubuntu 上,也会发生同样的事情,只不过您通常可以选择静态库或共享库,默认是动态库以保持文件大小较小。
一旦您开始编译使用 std::cout
的 C++ 程序来自<iostream>
,文件大小在 MinGW/mingw-w64 上显着增加。使用 libstdc++
的静态版本编译它使用-static-libstdc++
编译器选项最终会在 Cygwin 上产生更大的文件大小,但对于以下代码来说,两者最终都会超过 550 KiB:
#include <iostream>
int main ()
{
std::cout << "Hello, world!" << std::endl;
}
不确定它在 Ubuntu 上是什么,但我想与静态链接的 C++ 库相比,与等效的几 KiB 的 C 代码相比,它也相当大。但就我个人而言,我不会担心这一点。正如俗话所说,如今存储和内存相当便宜,因此我会更多地关注执行时间和避免内存泄漏,而不是担心可执行文件的文件大小。
关于编译差异: Windows vs. Linux,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28847025/