C语言 | 程序的编译和链接

1. 翻译环境&运行环境

翻译环境:程序将进行编译(包括预处理、编译、汇编),链接两步操作,将源代码转换为可执行程序(.exe)

执行环境:用来执行代码。

下文将浅浅解析具体过程~

2. 翻译环境

翻译环境中,源代码会经过预处理、编译、汇编、链接四个过程,一点一点地转变为机器可以看懂的二进制指令。

下文将以gcc环境为例,逐步拆解分析。

2.1 预处理

2.1.1 处理前后变化

1.文件类型从.c转换为.i

2.所有#define被删除,展开所有宏定义

3.处理所有条件编译指令 eg.#if 、 #ifdef 、 #elif 、 #else 、 #endif

4.#include所包含的头文件内容将会被插入到该指令所在位置。

5.所有注释会被删除

6.自动添加行号和文件名标识。

7.保留所有#pragma指令

(预处理的详解,以后会写。)

2.2 编译

1.文件类型发生变化,从.i后缀转换为.s后缀。

2.对预处理后的文件进行词法分析、语法分析、语义分析及优化,生成汇编代码文件。

2.2.1 词法分析

进行分词,并标记类型,如关键字、标识符、字面量、特殊符号等。

2.2.2 语法分析

建立语法树。

eg.arr[3]=5+3;

2.2.3 语义分析

该过程声明和类型的匹配,类型的转换等。

语法报错就是在这个阶段进行的。

2.3 汇编

1.文件类型从.s后缀转换为.o后缀。

2.将汇编代码转换为机器可执行代码。

2.4 链接

链接:把⼀堆⽂件链接在⼀起⽣成可执⾏程序。

链接过程主要包括:地址和空间分配,符号决议和重定位等步骤。

重定位:譬如,我在test.c文件中使用了add.c中的Add()函数。在链接之前我是不知道该函数地址是什么的,便暂时搁置不处理。链接时,各个符号都有了地址之后,可把各模块中各符号的地址都修正成正确的值。这个时候test.c文件中的Add()函数地址就可以修正为真正的Add函数地址了。

链接解决的是⼀个项⽬中多⽂件、多模块之间互相调⽤的问题。

文章到这里就结束了,如果喜欢,请三连支持一下博主~

  • 11
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值