编译和链接

发布时间:2024年01月18日

在ANSIC的任何一种实现中,存在两个不同的环境。

? ? ? ? 第一种是:翻译环境,在这个环境中源代码被转换为可执行的机器指令(二进制指令)

? ? ? ? 第二种:是执行环境,它用于实际执行代码。

1.翻译环境

那翻译环境是怎样将源代码转换成为可执行的机器指令的呢?其实翻译环境是由编00译和链接两个大过程组成的,而编译又可以分解为:预处理(预编译)、编译、汇编三个过程。

一个C语言的项目中可能有多个.c文件一起构建,那多个.c文件如何生成可执行程序呢?

  • 多个.c文件单独经过编译器,编译处理生成对应的目标文件。
  • 在Windows环境下的目标文件的后缀是.obj,Linux环境下的目标文件的后缀是.o
  • ?多个目标文件和链接库一起经过链接器处理生成最终的可执行程序。

?2.预处理(gcc为例)

在预处理阶段,源文件和头文件会被处理成为.i为后缀的文件。

在gcc环境下观察text.c文件预处理后的.i文件的命令:

????????gcc -E text.c -o text.i

预处理阶段主要处理那些源文件中#开始的预编译指令。例如:#include\#define,处理规则:

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

?经过预处理后的 . i 文件中不再包含宏定义, 因为宏已经被展开。并且包含的头文件都被插入到. i 文件中。所以当我们无法知道宏定义或者头文件是否包含正确的时候, 可以查看预处理后的 . i 文件来确认。

3.编译?(符号汇总)

???????编译过程就是将预处理后的文件进行一系列的: 词法分析、语法分析、语义分析及优化, 生成相应的汇编代码文件编译过程的命令如下:

编译过程的指令如下:

????????gcc -S text.i -o text.s
词法分析:
将源代码程序被输入扫描器, 扫描器的任务就是简单的进行词法分析,把代码中的字符分割成一系列的记号(关键字、标识符、字面量、特殊字符等)

语义分析:

由语义分析器来完成语义分析, 即对表达式的语法层面分析。 编译器所能做的分析是语义的静态分析。静态语义分析通常包括声明和类型的匹配,类型的转换等。这个阶段会报告错误的语法信息。

4.汇编 (形成符号表)

汇编命令如下:

????????gcc -c text.s -o text.o

?5.链接(符号决议和重定位)

链接是一个复杂的过程, 链接的时候需要把一堆文件链接在一起才生成可执行程序。

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

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

文章来源:https://blog.csdn.net/2301_80002696/article/details/135661671
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。