上周我在网上发现了一款名为 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
最佳答案
我会充实我的评论作为答案:
<iostream>
有很多内部依赖性,即使使用简单的 cout 调用也是如此。它引入了许多它需要工作的其他代码/ header (包括模板代码等)。首先让我们说一下引入的大小 <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 - 这里有一个最近的主题:How to reduce the size of executable produced by MinGW g++ compiler?
MinGW gcc 4.5.0+ 应默认使用动态链接,如果您使用 MinGW,请检查您的版本。
关于c++ - 已编译二进制文件的大小如何取决于所使用的库? C/C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8625346/