文章目录
- 编译
- 预编译(预处理)
- 编译
- 汇编
- 链接
我们写完一个程序要经过 编译和 链接过程才能形成 可执行程序,那么编译和链接的具体过程究竟是什么呢?
首先,当我们写完一个工程后可能会有很多文件,这些文件会先 单独经过 编译器的处理形成 目标文件,在vs中,后缀为.obj的文件就是目标文件;Linux中,后缀为.o的文件就是目标文件
之后 所有的目标文件和链接库一起经过链接器的处理形成可执行文件,这里的链接库和目标文件一样 都是二进制文件,链接库 就是别人写好的,开源的库文件经过编译,打包好的二进制文件,但是这些链接库无法独立的运行,必须经过其他程序的调用才会被载入内存。这里所说的 编译器和链接器都是可执行文件,都是可以在我们的电脑中搜索到的
因为VS2019是集成开发环境,这些具体的步骤不是那么容易观察,我们这里选择 Linux操作系统中的gcc编译器来观察一下它们的具体过程
首先我们要知道,整个翻译环境分为编译和链接两个过程,而编译又可以分为 预编译(也叫预处理), 编译和 汇编三个过程
编译
预编译(预处理)
首先我们通过命令让.c文件预编译一下
执行完后,就会形成一个test.i 的文件,
我们先来看一下之前.c 文件中有什么内容
我们再看一下预处理后.i文件中有什么内容
其实上边还有很多的内容,对比这两张图片,我们可以看到,预编译过程会进行头文件展开,去掉注释,宏替换等一些文本性的操作
以及所有的预处理指令都是在预处理阶段处理的
编译
下面我们来看一下编译过程都进行了什么,我们还是通过命令先形成一下这个文件
它就会形成file.s这个文件,我们可以打开这个文件
我们可以看到都是一些汇编代码,也就是说,编译过程将C语言代码生成了汇编指令
汇编
接下来就是汇编这个过程,指令是
这里的目标文件我们上边说过是二进制文件,我们直接打开肯定是乱码,但是在Linux下gcc编译的目标文件和可执行文件都是按照ELF这种文件的格式来存储的,我们想打开的话也可以
可以看到右下角是我们认识的一些符号,所以汇编过程也会形成符号表
链接
编译过程完成之后,就到了链接过程
这里的file就是我们的可执行文件
所以在链接这个过程,经历了符号表的合并和重定位以及合并段表,因为前边我们可以看到,代码都是分成段去存储的
有这些不同的种类
那么到这里,一个非常简单的从一个C语言文件到可执行文件的过程就说清楚了