使用Code blocks编译的Exe文件比使用Visual Studio编译的相同代码的文件大57倍。

3

这段代码:

#include <iostream>
using namespace std;

int main()
{
    cout << "Hello world!\n";
    return 0;
}

在Code::Blocks与GCC 4.4.1编译时,大小为457KB,在VS2010中只有8KB(八KB)。两个编译器都针对大小进行了优化。

有人知道为什么会有这样的差异吗?


4
是否包含调试信息?如果有,您是否考虑过由VS生成的.PDB文件的大小? - trojanfoe
+1 457KB 看起来相当过度了。我很好奇答案是什么。 - templatetypedef
2
你说“Code::Blocks”,但它支持大量编译器。在设置时,你选择了哪一个? - Merlyn Morgan-Graham
1
你剥离了代码块的exe吗?VS调试信息在一个单独的文件中,gcc的调试信息与exe在同一个文件中(上次我检查这些东西时)。此外,运行时库是静态链接还是动态链接到exe? - Martin York
1
可能是Compiled C++ executables HUGE?的重复问题。 - Merlyn Morgan-Graham
2个回答

6
由于g++静态链接c++标准库,而VS则动态链接它,所以导致这种情况。在cygwin下使用gcc进行快速检查,可以得到大约相同的大小,并且生成的exe文件只会导入一些C函数。
#include <stdio.h>
int main() {
  printf("Hello world\n");
  return 0
}

另一方面,使用gcc编译此应用程序时生成的最小EXE文件与使用C++功能无关。


1

你说得对,使用gcc编译的可执行文件显然更大,在你的情况下比vc++编译的大57倍。

主要原因是使用GCC编译的程序不需要任何外部依赖项即可运行,而使用VS2010编译的程序至少需要其运行时文件存在于系统中。

例如,假设你在一位没有安装vs2010的朋友的计算机上尝试运行它,而是尝试在早期的操作系统(如XP)上运行,甚至没有运行VS2010运行时文件的机会。

使用GCC构建的程序将没有问题,而使用VS2010构建的程序将抛出缺少运行时文件(依赖项)的错误。

希望这可以帮助到你,如果没有或者你有任何其他问题,请随时问我,我很乐意帮助你 :)


所以你的意思是 VC 生成的可执行文件使用动态库,而 GCC 生成的可执行文件使用共享库?没有任何迹象表明这一点,但你可能是对的。 - trojanfoe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接