当前位置: 首页 > news >正文

C++:5.编译加载过程

目录

1.预编译

2.编译

3.汇编

4.链接

5.加载/运行

6.一键编译指令


C++代码从编译到最终执行,中间大致分为5个步骤:预编译、编译、汇编、链接、运行。

1.预编译

预编译,又叫预处理。执行指令过程为:g++ -E a.cpp -o a.ii。这个过程,主要做的事情有:

1.清理代码注释。

用// 或/* */注释的代码,都会被清空。

2.替换宏定义。

比如 #define PI 3.14,代码中使用了这个宏,如 double value = PI。那么预编译时候,PI会被直接替换为3.14,即double value = 3.14。

3.插入include引入的文件内容

把引入头文件的所有内容,直接复制粘贴到当前文件中。所以a.ii通常会比a.cpp大不少。

4.清理条件编译代码

条件编译关键字有#ifdef、#ifndef、#if、 #else、#elif 、#endif,会按具体条件逻辑保留部分代码,删除另外部分代码。

5.添加行号

便于debug调试使用或报错时定位哪一行代码。

2.编译

执行指令过程为:g++ -S a.ii -o a.s。主要用来对预编译后的文件代码,进一步检查语法、语义、词法等是否正确。比如变量类型错误、缺少“}”、缺少“;”等等,都是在这里检查。

此外,编译还会对代码进行优化,比如,int a=4+6。编译时候会被改为int a=10。

3.汇编

执行指令过程为:g++ -C a.s -o a.o。主要用来将编译生成的汇编代码转换为二进制机器指令。不通平台或系统,这里生成的肯定是不一样的。目标文件格式Windows下是.obj,linux下是.o。

汇编在生产二进制指令时,还会做一个重要事情,就是生成符号表。那什么是符号表呢?顾名思义,符号表存储的就是一堆符号。而符号,指的就是代码中的变量、函数名、全局常量等。符合有很多属性,包括名称、类型、作用域、地址、行号等。

比如debug时候,生成的可执行文件比较大,就是因为里面包含了符合表信息。在debug时候,能看到函数调用关系,也能知道哪一行报错了。如果没有符合表,比如release版本,保存时候,看到的都是各种16进制地址。

4.链接

执行指令过程为:g++ a.o b.o -o main。主要用来将目标文件、系统库、第三方库.o/.a/.so文件连接起来,生成一个可执行的文件。这里面又可以细分为几个功能。

1.合并段

主要用来合并各个目标文件的代码段 (.text)、数据段 (.data/.bss),统一布局内存地址。

可以用如下命令查看可执行文件中各个段的情况。

readelf -S main

查看结果如下。里面的代码段.text和数据段.data和.bss都能看到。

2.符合解析

匹配引用符号(函数 / 全局变量)和真实符号定义

3.重定位

修正代码里的地址占位符,把外部函数调用、全局变量访问地址改成真实内存偏移地址

4.库链接

静态链接(.a/.lib):把库直接切入到可执行程序中 。下次可以独立运行,不需要额外依赖库。缺点就是体积比较大。

动态链接(.so/.dll/.dylib):体积小,但运行时必须有额外配套的依赖库,本身独立运行不了。

5.加载/运行

当执行命令./main时,程序开始运行。中间可以细分为如下几个过程。

1.创建进程虚拟地址空间

2.将可执行文件的代码段、数据段映射等载入进程虚拟内存

3.处理动态链接:动态链接器(ld-linux.so/msvcrt.dll 等)加载依赖的动态库,完成运行时符号重定位。

4.初始化全局变量、静态变量、初始化栈 、堆等

5.设置程序入口(不是直接 main 函数!是系统启动函数 _start / CRT 运行时库入口)

6.一键编译指令

直接用 -o 命令,一步生成可执行文件。

gcc main.c -o mian
http://www.jsqmd.com/news/1215396/

相关文章:

  • 2026巴彦淖尔宣传片制作公司五大服务商权威排名深度实测 — 独家评分体系+三维动画与信息流广告制作报价对比,附企业选型避坑指南 - 影视产业研究
  • 韩山师范学院23级“3+1”微专业暑期实训开班仪式圆满举行
  • 【桁架】基于matlab三维桁架优化以实现最大刚度【含Matlab源码 15893期】含报告
  • 芯片异常复位问题(看门狗异常复位)
  • GPU 与 CPU 架构差异
  • 《GEO(生成式引擎优化)的核心逻辑与多平台信源策略分析》
  • 2026郴州宣传片制作公司TOP5排名权威评测报告 | 真实报价对比+短视频制作与品牌宣传片评测数据,附企业选型避坑权威指南 - 影视产业研究
  • Source Insight 4.0如何删除没用的Open Project列表
  • 团队拓客标准化利器:逐光标讯,统一管理标讯线索,告别信息孤岛
  • AI时代企业哪家强?深度对比评测:广州裕富科技如何用四大模型颠覆直播行业
  • 2026丽江活动跟拍公司TOP5权威排名深度实测 — 独家评分体系+会议跟拍与商业航拍报价对比,附企业选型避坑指南 - 影视产业研究
  • 【React】受控组件与非受控组件:状态管理范式、适用场景与决策框架
  • 2026 烘箱烤炉传感器怎么选 M50稳定运行3年零故障案例
  • 高速PCB设计进阶:从阻抗本质到过孔换层的完整解析
  • 游戏出海实战复盘:专业客服如何用40分钟保住2000美元高价值用户
  • 莱文AI:人工智能如何助力企业实现AI数字化转型
  • 【CUDA】并行计算基本概念
  • 2026巴彦淖尔活动跟拍公司五大服务商权威排名深度实测 — 实测报价数据+会议跟拍与商业航拍对比分析,附行业选型避坑权威指南 - 影视产业研究
  • 别再用普通AI写课题申报书!
  • 2026普洱宣传片制作公司TOP5排名权威评测报告:独家十维评分+TVC广告与短视频制作报价对比,附选型避坑权威指南 - 影视产业研究
  • 员工电脑如何监控?三种主流监控方法分享,哪个性能更强劲?
  • 植物营养补给 解锁蔓越莓膳食的多元价值
  • 搅拌器需要专人操作吗?一句话讲清合规标准
  • 【全网唯一多级匹配合并采集工具|TW 源库工具解决苹果 CMS 重复视频数据、采集慢难题,不用再傻傻等待无需值守,苹果cms重名数据,高效cms采集合并封面/海报图片检测等】
  • 2026临汾活动跟拍公司TOP5权威排名深度实测 | 真实报价对比+云摄影与活动摄影服务评测,附行业选型指南 - 影视产业研究
  • 机械零件加工7种工艺能力对比与选择策略
  • 本地进程缓存
  • 【桁架】三维桁架优化以实现最大刚度【含Matlab源码 15893期】含报告
  • 暑期实践日志 Day5:完成开题报告提交,继续学习视频剪辑操作
  • BlenderGIS终极错误排查指南:从安装到数据处理的完整解决方案