编译差异:Windows与Linux

时间:2015-03-04 05:07:28

标签: c linux windows

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

在编译程序后,我检查了它们的文件大小,并注意到Windows上的.exe远远大于Ubuntu上的69,280

对于Windows,我得到的文件大小为8,703个字节,但在Ubuntu上,我的大小只有{{1}}个字节。

这里发生了什么?

1 个答案:

答案 0 :(得分:2)

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

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

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

一旦你编译了使用std::cout <iostream>的C ++程序,MinGW / mingw-w64的文件大小就会大大增加。使用libstdc++编译器选项使用静态版本的-static-libstdc++进行编译会在Cygwin上以更大的文件大小进行编译,但是对于以下代码,它们最终都会高于550 KiB:

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

不确定它在Ubuntu上是什么,但我认为它与静态链接的C ++库相比也相当大,而且与同等C代码的少量KiB相比。就个人而言,我并不担心。如上所述,存储和内存现在相当便宜,所以我更关注你的执行时间和避免内存泄漏,而不是担心可执行文件的大小。