编译后的二进制文件的大小如何依赖于使用的库? C / C ++

时间:2011-12-24 15:27:32

标签: c++ c gcc iostream stdio

上周我在网上发现了一个名为killallcops.exe的简单游戏。 我研究了二进制文件,并想知道为什么程序很大。 (约460k)

所以我用iostream重写了游戏

#include <iostream>
int main(){
    std::cout << "All cops are killed.\nCongratulations";
    std::cin.ignore();
    return 0;
}

用g ++编译它并得到460k。

我真的很想知道为什么这个东西如此之大并使用stdio重写它

#include <stdio.h>
int main(){
    printf("All cops are killed.\nCongratulations");
    while(getchar() != '\n'){}
    return 0;
}

用gcc编译并得到13k。

我知道iostream比stdio(比如类型安全)有更多的能力,因此它本身要大得多,但为什么这会产生更大的二进制文件,并且在使用iostream时有减少大小的解决方案,例如仅使用特定部件它?

编辑:如下所述,使用cygwin下的gcc 3.4.4

3 个答案:

答案 0 :(得分:3)

我会充实我的评论作为答案:

<iostream>有很多内部依赖关系,即使使用简单的cout调用也是如此。它带来了许多需要工作的其他代码/头文件(包括模板代码等)。我们可以说,在一个非常重要的应用程序中,引入<iostream>的大小可能不是很重要。

您可以信任编译器/链接器以了解它们正在做什么,但是如果您想减少二进制文件大小,请尝试使用gcc -s之类的选项来删除符号或-Os之类的标记它试图优化二进制的大小。

我怀疑你的二进制大小问题实际上来自其他东西:静态链接的libstdc++

如果您在Windows上使用MinGW,请注意,直到最近,他们对GCC工具链的实施没有动态链接libstdc++;相反,所有C ++在libstdc++中建立静态链接,这将大大增加二进制文件的大小。

这是一个比较,使用GCC 4.6.1在Linux上为您的代码生成的g++二进制文件的大小。没有对这些构建执行优化或符号剥离。

λ > ls -lh a.out          
-rwxr-xr-x 1 billylee billylee 6.1K Dec 24 10:37 a.out

这是由GCC制作的一个

λ > ls -lh trial
-rwxr-xr-x 1 billylee billylee 4.9K Dec 24 10:41 trial

g ++版本比gcc版本略大,但不大100倍。

编辑:如果你正在使用MinGW - 这里有一个最近的帖子:How to reduce the size of executable produced by MinGW g++ compiler?

MinGW gcc 4.5.0+默认情况下应使用动态链接,如果您使用MinGW,请检查您的版本。

答案 1 :(得分:2)

我不在Linux上重现(大小为9K和8K)。我的猜测是,对于C ++,你是静态链接标准库,而对于C,你是动态链接它。

答案 2 :(得分:2)

答案是:它不是那么大。在Linux上的c ++ 4.6上编译,没有编译选项,它是9040字节。剥离后它是6312字节。

您使用了哪些编译选项以及您使用的是哪个版本的g ++?

大小可能是由您的平台引起的,可能是您正在使用MinGW并且它是静态链接运行时。

另一方面,#import是该语言不推荐使用g ++的扩展程序,您应该使用#include