添加单个源文件后g++编译的可执行文件体积大幅增大的原因
为什么新增源文件后可执行文件体积明显增长?
出现这种体积增长主要有以下几个核心原因:
调试信息的重复生成:你使用了
-g编译选项,这个选项会为每个编译单元(.cpp文件)生成完整的调试符号信息。当新增b.cpp后,编译器会为b.cpp单独生成一套包含<string>头文件展开细节、变量m_name_b的调试符号(比如行号、类型信息、文件路径)。即使a.cpp已经包含了<string>的调试信息,链接器不会自动合并不同编译单元中的重复调试内容,这部分重复的调试信息会直接带来体积增加。全局对象的初始化/析构代码:每个全局
std::string对象都会生成独立的初始化和销毁代码。m_name_a和m_name_b作为两个独立的全局对象,各自需要在程序启动时调用std::string的构造函数,退出时调用析构函数。这些初始化入口会被添加到程序的初始化段中,虽然std::string的核心实现是共享的,但每个对象的初始化逻辑是独立的,会增加代码段的体积。编译单元的独立符号表:每个.cpp文件编译后会生成自己的符号表条目,包括全局变量的符号、头文件中隐含的静态符号等。链接器在合并编译单元时,会保留每个编译单元的符号信息,尤其是和调试绑定的符号,这部分内容进一步推高了可执行文件的大小。
简单来说,新增的b.cpp带来了独立的调试信息、额外的全局对象初始化逻辑,加上编译单元本身的符号开销,共同导致了约35KB的体积增长。
内容的提问来源于stack exchange,提问作者DuduArbel
相关产品推荐
相关产品推荐

