编译后二进制文件的大小如何取决于所使用的库?c / c++

how does the size of compiled binaries depend on the used libraries? c/c++

本文关键字:c++ 取决于 二进制文件 编译      更新时间:2023-10-16

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

所以我用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

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

<iostream>有很多内部依赖,即使使用一个简单的cout调用。它带来了许多其他需要工作的代码/头(包括模板代码等)。首先,让我们假设引入<iostream>的大小在一个重要的应用程序中可能不是很重要。

你可以相信编译器/链接器知道他们在做什么,但是如果你想减少二进制文件的大小,尝试使用像gcc -s这样的选项,它会去除符号,或者像-Os这样的标志,它会尝试优化二进制文件的大小。

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

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

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

λ > 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 -这里有一个最近的线程:如何减少由MinGW编译器产生的可执行文件的大小?

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

我没有在Linux上复制(大小为9K和8K)。我的猜测是,对于c++,您是静态链接标准库,而对于C,您是动态链接它。

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

你使用了哪些编译选项,你使用的是哪个版本的g++ ?

这可能是由于您的平台,也许如果您使用MinGW,它是静态链接运行时的大小。

另外,#import是已弃用的仅支持g++的语言扩展,您应该使用#include