【C语言进阶】编译链接(一)

简介: 【C语言进阶】编译链接(一)

310bab475d774222b9a3eba35c2e38f0.gif

📖程序的两种环境

 在ANSI C的任何一种实现中,都存在两种环境

  • 翻译环境
  • 执行环境
  • ANSI就是美国国家标准协会的简称,而ANSI C就是美国国家标准协会创立的一套C标准,该标准于1989年完成,这个版本的语言经常被叫做ANSI C有时也称为C89

🔖翻译环境

在这个环境下源代码被转换成可执行的机器指令。我们平时用VS等工具写出来的源代码都是由字符组成的,只有我们人才能读懂其中的意思,机器是不能直接读懂的,机器只能执行二进制指令,因此就需要把我们写的源文件变成机器指令。而我们写的以 .c 结尾的源文件就是经过翻译环境才得以变成以 .exe 结尾的可执行程序(里面包含的就是可执行指令)。

8bf930e09c184844b7d669efcd326e7d.png

 在VS中由源代码生成一个可执行程序的过程如下图所示:

ebb399e555d1496e8a6333f2109d0925.png


802e35c7e828485c9de8b8315d8c7c34.png

如上图所演示的,VS2019其实就充当了翻译环境,VS2019是一种集成开发环境。

🔖执行环境

 执行环境是用于实际执行代码的。

📖详解翻译环境

 编译和链接是翻译环境的两大组成部分,编译环境又细分了预编译、编译、汇编三个小部分,下面我用一张图来展示它们之间的关系。

19a6f394ea454c6f8bbb81a3bed14c57.png

 注意: 上图仅仅展现了它们之间的包含关系,并没有反映出它们的执行顺序,正确的执行顺序是:预编译、编译、汇编、链接。

🔖从人的角度去看编译链接

 作为程序员我们只需要将写好源代码交给编译器最终就会得到我们想要的结果,我们无需关心编译器到底进行了哪些操作。具体的过程是:编译器会对我们写的每一个源文件进行单独处理得到一个目标文件,再经链接器把这些所有的目标文件链接到一起,最终得到一个可执行程序

08792f775c9b435994debecddb8c0c85.png


 其中链接库就是指将库文件编译后打包为一个二进制文件,这些二进制文件会在程序调用的时候加载到内存。

c546b42552524c1485fe82e6fe60bf5e.png

5c8521b733a5448e9c551ec287eeb004.png

 如上图,此时我们的工程下由两个源文件,分别是text.c和add.c,在生成解决方案后,我们可以在相应的路径下看大它们分别对应的.obj文件。

 了解了从人的角度去看编译链接接下来就让我们深入计算机的底层去看看编译链接的“庐山真面目”。


🔖预编译

 为了更加直观的展示编译过程的细节,后面我将利用gcc这款编译器进行演示

 首先创建一个text.h文件和一个text.c文件,如下图所示:

5bbb2dbabc6a4bfa8aad467fc49fd898.png

 要得到预处理后的文件需要用下面这条命令:gcc -E text.c -o text.i

  • gcc表示用gcc这个编译器
  • -E表示执行完预处理就停止下来
  • -o text.i表示生成一个text.i文件来存放预处理后得到的结果
  • 6e8d10db98c54e639fcb571675d6d399.png
  • 通过对比,我们可以发现text.i文件相对于text.c文件主要发生了以下几个方面的改变

在text.i文件中把text.h文件中的内容拷贝了过来。

其次在text.i文件中对#define定义的标识符常量进行了替换和删除。

注释的删除。

 为什么会出现这种结果?因为#include和#define都叫做预处理指令,跟预处理指令相关的操作都会在预编译阶段做处理,并且这些处理都是一些文本操作(内容的拷贝、宏的替换和删除、注释的删除)


目录
相关文章
|
2月前
|
存储 自然语言处理 编译器
【C语言】编译与链接:深入理解程序构建过程
【C语言】编译与链接:深入理解程序构建过程
|
2月前
|
自然语言处理 编译器 Linux
【C语言篇】编译和链接以及预处理介绍(上篇)1
【C语言篇】编译和链接以及预处理介绍(上篇)
43 1
|
19天前
|
存储 自然语言处理 Unix
【C语言】C语言 4 个编译过程详解
编译是将源代码转换为目标代码的过程。它是在编译器的帮助下完成的。编译器检查源代码是否存在语法或结构错误,如果源代码没有错误,则生成目标代码。
43 1
|
2月前
|
存储 自然语言处理 编译器
|
2月前
|
编译器 Linux C语言
【C语言篇】编译和链接以及预处理介绍(下篇)
【C语言篇】编译和链接以及预处理介绍(下篇)
37 1
【C语言篇】编译和链接以及预处理介绍(下篇)
|
2月前
|
自然语言处理 编译器 Linux
C语言中抽象的编译和链接原理
C语言中抽象的编译和链接原理
23 1
|
2月前
|
存储 C语言
【C语言篇】编译和链接以及预处理介绍(上篇)2
【C语言篇】编译和链接以及预处理介绍(上篇)
40 0
|
19天前
|
存储 C语言 开发者
【C语言】字符串操作函数详解
这些字符串操作函数在C语言中提供了强大的功能,帮助开发者有效地处理字符串数据。通过对每个函数的详细讲解、示例代码和表格说明,可以更好地理解如何使用这些函数进行各种字符串操作。如果在实际编程中遇到特定的字符串处理需求,可以参考这些函数和示例,灵活运用。
39 10
|
19天前
|
存储 程序员 C语言
【C语言】文件操作函数详解
C语言提供了一组标准库函数来处理文件操作,这些函数定义在 `<stdio.h>` 头文件中。文件操作包括文件的打开、读写、关闭以及文件属性的查询等。以下是常用文件操作函数的详细讲解,包括函数原型、参数说明、返回值说明、示例代码和表格汇总。
42 9
下一篇
DataWorks