0

0

C++编译过程的四个阶段_C++预处理、编译、汇编与链接解析

冰火之心

冰火之心

发布时间:2026-01-13 15:37:02

|

190人浏览过

|

来源于php中文网

原创

预处理:处理#指令,展开头文件、宏替换、条件编译,生成.i文件;2. 编译:将.i文件翻译为汇编代码.s文件,进行语法检查与优化;3. 汇编:将.s文件转为机器码.o目标文件,生成符号表;4. 链接:合并多个.o文件和库,解析符号引用,生成可执行文件。

c++编译过程的四个阶段_c++预处理、编译、汇编与链接解析

在C++程序从源代码变成可执行文件的过程中,编译器会经历四个关键阶段:预处理、编译、汇编和链接。每个阶段都有明确的任务,理解这些过程有助于排查错误、优化代码以及深入掌握底层机制。

C++预处理阶段

预处理是编译流程的第一步,由预处理器(preprocessor)完成。它处理源代码中以#开头的指令,例如包含头文件、宏替换和条件编译等。

主要任务包括:
  • #include:将指定的头文件内容插入到当前源文件中,便于代码复用
  • #define:进行宏定义替换,文本替换发生在编译前。
  • #ifdef / #ifndef / #endif:根据条件决定是否包含某段代码,常用于跨平台编译。
  • 删除注释和多余的空白字符,生成纯净的.i文件(如hello.i)。

可以通过g++ -E hello.cpp -o hello.i命令单独执行预处理,查看处理后的结果。

C++编译阶段

编译阶段将预处理后的.i文件转换为汇编语言文件(.s),这是真正意义上的“编译”。编译器在此阶段进行词法分析、语法分析、语义分析和优化,最终生成目标平台相关的汇编代码。

立即学习C++免费学习笔记(深入)”;

核心工作包括:
  • 检查语法和类型错误,例如变量未声明、函数调用不匹配等。
  • 将高级C++代码翻译成低级的、接近机器指令的汇编语句。
  • 进行代码优化,如常量折叠、死代码消除等(取决于优化级别)。

使用g++ -S hello.i -o hello.s可以生成汇编代码文件,便于查看编译器如何翻译C++逻辑。

怪兽AI数字人
怪兽AI数字人

数字人短视频创作,数字人直播,实时驱动数字人

下载

C++汇编阶段

汇编器将编译阶段输出的.s汇编文件翻译成二进制的机器指令,生成目标文件(.o 或 .obj)。这个文件已经是机器能识别的格式,但还不能直接运行,因为它可能依赖其他模块中的函数或变量。

特点如下:
  • 每条汇编指令被转换为对应的机器码。
  • 生成符号表,记录函数名、全局变量等符号及其偏移地址。
  • 外部引用标记为未解析状态,留待链接阶段处理。

通过g++ -c hello.s -o hello.o或直接g++ -c hello.cpp可生成目标文件。

C++链接阶段

链接器负责将一个或多个目标文件(.o)以及所需的库文件合并成一个可执行文件。它解决各个模块之间的符号引用问题,确保所有函数和变量都能正确寻址。

主要功能有:
  • 合并多个目标文件,适用于大型项目分模块编译。
  • 解析外部符号,比如main函数调用printf时,链接标准C库(libc)来提供实现。
  • 处理静态库(.a)与动态库(.so 或 .dll)的加载方式差异。
  • 分配最终的内存布局,确定各段(text、data、bss等)的运行时地址。

输入g++ hello.o -o hello即可完成链接,生成最终的可执行程序。

基本上就这些。整个流程环环相扣,任何一个阶段出错都会导致构建失败。了解这四个阶段,能帮助你读懂编译器报错信息,也能更好地理解头文件包含、静态链接与动态链接的区别。不复杂但容易忽略。

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1463

2023.10.24

typedef和define区别
typedef和define区别

typedef和define区别在类型检查、作用范围、可读性、错误处理和内存占用等。本专题为大家提供typedef和define相关的文章、下载、课程内容,供大家免费下载体验。

107

2023.09.26

define的用法
define的用法

define用法:1、定义常量;2、定义函数宏:3、定义条件编译;4、定义多行宏。更多关于define的用法的内容,大家可以阅读本专题下的文章。

332

2023.10.11

printf用法大全
printf用法大全

php中文网为大家提供printf用法大全,以及其他printf函数的相关文章、相关下载资源以及各种相关课程,供大家免费下载体验。

72

2023.06.20

fprintf和printf的区别
fprintf和printf的区别

fprintf和printf的区别在于输出的目标不同,printf输出到标准输出流,而fprintf输出到指定的文件流。根据需要选择合适的函数来进行输出操作。更多关于fprintf和printf的相关文章详情请看本专题下面的文章。php中文网欢迎大家前来学习。

280

2023.11.28

全局变量怎么定义
全局变量怎么定义

本专题整合了全局变量相关内容,阅读专题下面的文章了解更多详细内容。

75

2025.09.18

python 全局变量
python 全局变量

本专题整合了python中全局变量定义相关教程,阅读专题下面的文章了解更多详细内容。

96

2025.09.18

PPT交互图表教程大全
PPT交互图表教程大全

本专题整合了PPT交互图表相关教程汇总,阅读专题下面的文章了解更多详细内容。

39

2026.01.12

Java 项目构建与依赖管理(Maven / Gradle)
Java 项目构建与依赖管理(Maven / Gradle)

本专题系统讲解 Java 项目构建与依赖管理的完整体系,重点覆盖 Maven 与 Gradle 的核心概念、项目生命周期、依赖冲突解决、多模块项目管理、构建加速与版本发布规范。通过真实项目结构示例,帮助学习者掌握 从零搭建、维护到发布 Java 工程的标准化流程,提升在实际团队开发中的工程能力与协作效率。

19

2026.01.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 6.6万人学习

C 教程
C 教程

共75课时 | 4万人学习

C++教程
C++教程

共115课时 | 12万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号