gpt4 book ai didi

c++ - 对于相同的 c++ 源文件,其 gcc 可执行文件在 Windows 中比在 Linux 中大 655 倍。为什么差别这么大?

转载 作者:IT王子 更新时间:2023-10-29 01:01:00 27 4
gpt4 key购买 nike

我在装有 GCC 4.8.2 的 Windows 8.1、Intel i7-3517U 64 位笔记本电脑上测试这个简单的 C++ 代码。

#include<iostream>

using namespace std;

int main(int argc, char **argv){
cout << "This test code will simply display any arguments passed." << endl ;
for(int i=0; i<argc; i++){
cout << argv[i] << endl ;
}
return 0 ;
}

令人惊讶的是,编译后的可执行文件竟然是5905KB。出于好奇,我尝试在 Linux Fedora 20 64 位机器上使用相同的 GCC 版本编译相同的文件。可执行文件只有 9KB

在使用 g++ -Ox -o fileWithOx.exe file.cpp (x=1,2,3,s) 进行各种优化后,Windows 可执行文件的大小几乎相同。在做了一些研究之后,关注 MinGW's advise我尝试使用 strip g++ -s -o fileWithStrip.exe file.cpp 在不调试信息的情况下编译它们,但可执行文件仍然 597KB 大。

而另一方面,对于相同的选项,Linux 可执行文件只有 6-13KB

做一些实验,some more research & stack overflowing ,我几乎确信巨大的大小是由于 iostream 链接到许多其他头文件和/或生成一些初始化代码。

但我怀疑在 Windows 和 Linux 中都使用 iostream。那为什么大小相差这么大呢?我知道 Windows 和 Linux 可执行文件的工作方式不同。 但是大了655倍,是不是有点极端了?

最佳答案

差异可能不是由于编译,而是链接版本阶段。

首先尝试只编译,使用 -c 停止命令,例如g++ -c code.cpp 在类 Unix 中,并在您的 Windows 环境中找到等效的标志。然后比较目标文件,它们的大小应该差不多。这些目标文件(.o 扩展名)仅包含您的代码到机器代码的翻译。大小可能不同,比如可能是 2 或 3 倍,但这无关紧要。

发生的事情是您的 Windows 编译器可能在某些库上使用了静态链接,因此可执行文件包含您在库中使用的代码。在类 Unix 上,编译器可能会动态链接所有内容,这表示库将在运行时加载,而不包含在可执行文件中。

请参阅您的编译器文档以了解如何强制执行静态/动态链接。您也应该知道,某些环境可能不提供这两种库...

关于c++ - 对于相同的 c++ 源文件,其 gcc 可执行文件在 Windows 中比在 Linux 中大 655 倍。为什么差别这么大?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21285335/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com