90.【C语言】编译和链接

1.翻译环境和运行环境总述

翻译环境:源代码被转换为机器码(又称为二进制指令)(包含编译和链接两个过程)依赖此环境

运行环境:可执行程序(Windows下的*.exe)到输出结果依赖此环境

2.翻译环境

翻译环境的解释

拆分为预处理(又称为预编译),编译和汇编三个过程

VS下的编译器:cl.exe,VS下的链接器:link.exe

编译器:一个或多个*.c文件(多个c文件会经过编译器的单独处理)-->*.obj(Windows下的目标文件) 链接器:*.obj+链接库-->*.exe

链接库:运行时库(它是支持程序运行的基本函数集合)或者第三方库,例如stdio.h包含了许多库函数

其实在VS2022的项目的目录下可以看到

保护模式下的DOSBox的编译和链接过程

如果有DOSBox的使用经验,便可以轻松理解上述的概念

1.编译1.asm的命令masm 1.asm

会产生三个文件:1.OBJ,NUL.LST,NUL.CRF

2.链接命令link 1;

执行完后会看到生成的两个文件

把编译器展开成3个过程的图

经历的几个过程

预处理(预编译)

源文件和头文件会被处理成为.i 为后缀的文件

1.删除所有的#define,并展开所有的宏定义
2.处理所有的条件编译指令,如: #if,#ifdef,#elif,#else,#endif
3.处理#include预编译指令,将包含的头文件的内容插入到该预编译指令的位置.这个过程是递归进行的,也就是说被包含的头文件也可能包含其他文件
4.删除所有的注释
5.添加行号和文件名标识,方便后续编译器生成调试信息等
6.或保留所有的#pragma的编译器指令,编译器后续会使用

编译

进行词法分析,语法分析,语义分析及优化等操作,生成汇编代码

汇编

汇编器将汇编代码转变成机器可执行的指令

链接

解决一个项目中多文件、多模块之间互相调用的问题

3.运行环境

1. 程序必须载入内存中才能运行

在操作系统的环境(保护模式下)中:由操作系统为程序分配内存

在独立的环境(实模式下)中:程序的载入必须手动安排,也可能是通过可执行代码置入只读内存来完

成(如单片机的下载(也称烧录))

2. 程序的执行的开始:调用main函数

3. 执行程序代码:程序将使用一个运行时堆栈(函数栈帧),存储函数的局部变量和返回地址.程序同时

也可以使用静态(static)内存,存储于静态内存中的变量在程序的整个执行过程一直保留他们的值

由关函数栈帧的详细讲解参见

36.【C语言】函数栈帧的创建和销毁

E40.【C语言】练习:有关栈帧的讨论(反汇编分析)

4. 终止程序:正常终止main函数或意外终止