编译差异: Windows vs. Linux

标签 c linux windows

我有一个用 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/

相关文章:

c - 如何解析 CFF 的 Top DICT INDEX 数据条目?

windows - IsAppThemed 和 IsThemeActive 有什么区别?

连接的udp多播需要在发送方绑定(bind)

c - 获取 JPEG 冗余数据

c - gcc 在我制作的静态库中找不到头文件

python脚本检测热插拔事件

linux - 将 Git 与 GitHub : `remote: Permission to username\project.git denied to myname.` 一起使用

php - 从 PHP 执行 Python 脚本

windows - Verilog 数组分配

linux - 带 I/O 重定向的管道停顿