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++逻辑。

Face++旷视
Face++旷视

Face⁺⁺ 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即可完成链接,生成最终的可执行程序。

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

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

1561

2023.10.24

typedef和define区别
typedef和define区别

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

118

2023.09.26

define的用法
define的用法

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

360

2023.10.11

printf用法大全
printf用法大全

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

76

2023.06.20

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

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

300

2023.11.28

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

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

87

2025.09.18

python 全局变量
python 全局变量

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

104

2025.09.18

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

0

2026.03.04

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

24

2026.03.03

热门下载

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

精品课程

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

共94课时 | 10.7万人学习

C 教程
C 教程

共75课时 | 5.2万人学习

C++教程
C++教程

共115课时 | 20.5万人学习

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

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