C语言(长期更新)第23讲:编译和链接
C语言(长期更新)第23讲
编译和链接
跟着潼心走,轻松拿捏C语言,困惑通通走,一去不回头~欢迎开始今天的学习内容,你的支持就是博主最大的动力。
博主主页:潼心1412o-CSDN博客
目录
C语言(长期更新)第23讲
编译和链接
知识回顾
23.1 翻译环境和运行环境
23.2 翻译环境
23.2.2 编译
23.2.3 汇编
23.2.4 链接
23.3 运行环境
知识回顾
上节课我们学习了文件操作,今天我们来继续学习编译和链接,坐稳了,我们发车,gogogo,出发喽!
23.1 翻译环境和运行环境
在ANSI C 的任何一种实现中,存在两个不同的环境
第一种是翻译环境,在此环境中源代码被转换为可执行的二进制指令(机器指令)
第二种是执行环境,用于实际执行代码
23.2 翻译环境
翻译环境由编译和链接两个大的过程组成
编译可分为预处理(预编译)编译 汇编三个过程
1.一个C语言项目由多个.c文件构建
2.每个.c文件经过编译器生成对应的目标文件
Windows环境下目标文件后缀为.obj,Linux环境下后缀为.o
3.多个目标文件和链接库一起经过链接器处理生成最终的可执行程序
Windows环境下k可执行程序文件后缀为.exe,gcc无,需自定义
链接库是指运⾏时库(它是⽀持程序运⾏的基本函数集合)或者第三⽅库
把编译过程再展开,可以得到3个过程
23.2.1 预处理
预处理阶段主要处理那些源⽂件中#开始的预编译指令 ⽐如:#include,#define
处理的规则如下:
- 将所有的 #define 删除,并展开所有的宏定义。
- 处理所有的条件编译指令,如: #if、#ifdef、#elif、#else、#endif
- 处理#include 预编译指令,将包含的头⽂件的内容插⼊到该预编译指令的位置。这个过程是递归进⾏的,也就是说被包含的头⽂件也可能包含其他⽂件。
- 删除所有的注释
- 添加⾏号和⽂件名标识,⽅便后续编译器⽣成调试信息等。
- 或保留所有的#pragma的编译器指令,编译器后续会使⽤。
经过预处理后的 .i ⽂件中不再包含宏定义,因为宏已经被展开。并且包含的头⽂件都被插⼊到 .i⽂件中。所以当我们⽆法知道宏定义或者头⽂件是否包含正确的时候,可以查看预处理后的 .i ⽂件来确认
23.2.2 编译
编译包括词法分析,语法分析,语义分析及优化
词法分析
源代码程序输入扫描器后,会进行简单的词法分析,将代码中字符分割成一系列的记号
如关键字,标识符等等
比如这段代码
会被拆分为16个记号
然后是语法分析
语法分析器会对扫描产生的记号进行语法分析,从而产生语法树
语法树以表达式为节点
语义分析
由语义分析器完成静态语义分析
通常包括声明和类型的匹配,类型的转换等。这个阶段会报告错误的语法信息
23.2.3 汇编
汇编器是将汇编代码转转变成机器可执⾏的指令,每⼀个汇编语句⼏乎都对应⼀条机器指令。就是根据汇编指令和机器指令的对照表⼀⼀的进⾏翻译,也不做指令优化
23.2.4 链接
链接过程主要包括:地址和空间分配,符号决议和重定位等这些步骤
链接解决的是⼀个项⽬中多⽂件、多模块之间互相调⽤的问题
23.3 运行环境
1. 程序必须载⼊内存中。在有操作系统的环境中:⼀般这个由操作系统完成。在独⽴的环境中,程序的载⼊必须由⼿⼯安排,也可能是通过可执⾏代码置⼊只读内存来完成。
2. 程序的执⾏便开始。接着便调⽤main函数。
3. 开始执⾏程序代码。这个时候程序将使⽤⼀个运⾏时堆栈(stack),存储函数的局部变量和返回地址。程序同时也可以使⽤静态(static)内存,存储于静态内存中的变量在程序的整个执⾏过程⼀直保留他们的值。
4. 终⽌程序。正常终⽌main函数;也有可能是意外终⽌。
好了今天的学习内容就到这里啦,谢谢你的陪伴,我是潼心,下次再见~如果这篇文章对你有帮助的话。请务必给主播一个一键三连,球球了,这对主播很重要~
博主主页:潼心1412o-CSDN博客