【问题标题】:Compilation Difference: Windows vs. Linux编译差异:Windows 与 Linux
【发布时间】:2015-05-05 00:03:55
【问题描述】:

我有一个用 C 语言编写的程序,我在我的 Windows 7 笔记本电脑和 Ubuntu 虚拟机上编译。我使用的编译器是 GCC,但在 Windows 7 上我已经下载了 MinGW。

编译程序后,我检查了它们的文件大小,发现 Windows 上的 .exe 远大于 Ubuntu 上的。

对于 Windows,我得到的文件大小为 69,280 字节,但在 Ubuntu 上,我得到的文件大小仅为 8,703 字节。

这是怎么回事?

【问题讨论】:

  • 我认为这个词被称为“膨胀”。尝试寻找here 的解决方案。
  • mingw 尝试在 windows 上模拟一些 POSIX 功能。它是通过使用额外的库来实现的。
  • 编译标志是否完全相同?
  • 我只使用gcc -o

标签: c linux windows


【解决方案1】:

无论您使用的是哪个本机运行时(MinGW 或 mingw-w64),您都会遇到这种膨胀。这是因为 Windows 可执行文件链接到静态库,而 Ubuntu 上的 GCC 链接到共享库(.dll 文件,如果你是 Windows 用户,.so 文件,如果你是 *nix 用户,.dylib如果您是 OS X 用户)。

我刚刚用一个非常小的 C 程序测试了 Cygwin64 与 mingw-w64(甚至没有任何头文件,因为有些可能会用他们自己的调用函数的宏替换你的函数调用),包括调试信息,没有优化,Cygwin 来了以 67024 字节与 132206 字节作为文件大小的赢家。优化文件大小并去除所有符号,差异仍然有利于 Cygwin:8.5 KiB 与 15.5 KiB。值得一提的是,两者都是在 64 位模式下编译的。

这可能部分是由于需要静态库(mingw-w64 通常使用静态链接)与共享库/dll 文件(Cygwin 似乎通常使用动态链接)。在 Ubuntu 上,同样的事情也会发生,除了您通常可以选择静态库或共享库,默认为动态库以保持文件较小。

一旦您从<iostream> 编译使用std::cout 的C++ 程序,MinGW/mingw-w64 上的文件大小会显着增加。使用-static-libstdc++ 编译器选项使用libstdc++ 的静态版本编译它最终会在Cygwin 上产生更大的文件大小,尽管对于以下代码,两者最终都会超过550 KiB:

#include <iostream>
int main ()
{
  std::cout << "Hello, world!" << std::endl;
}

不确定它在 Ubuntu 上是什么,但我想与等效的 C 代码的几个 KiB 相比,静态链接的 C++ 库也相当大。不过就个人而言,我不会担心。俗话说现在存储和内存相当便宜,所以我会更多地关注您的执行时间和避免内存泄漏,而不是担心可执行文件的文件大小。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-17
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多