编译+链接

文章目录

  • 编译
    • 预编译(预处理)
    • 编译
    • 汇编
  • 链接

我们写完一个程序要经过 编译链接过程才能形成 可执行程序,那么编译和链接的具体过程究竟是什么呢?
首先,当我们写完一个工程后可能会有很多文件,这些文件会先 单独经过 编译器的处理形成 目标文件,在vs中,后缀为.obj的文件就是目标文件;Linux中,后缀为.o的文件就是目标文件
在这里插入图片描述
在这里插入图片描述
之后 所有的目标文件和链接库一起经过链接器的处理形成可执行文件,这里的链接库和目标文件一样 都是二进制文件,链接库 就是别人写好的,开源的库文件经过编译,打包好的二进制文件,但是这些链接库无法独立的运行,必须经过其他程序的调用才会被载入内存。这里所说的 编译器和链接器都是可执行文件,都是可以在我们的电脑中搜索到的
在这里插入图片描述
在这里插入图片描述
因为VS2019是集成开发环境,这些具体的步骤不是那么容易观察,我们这里选择 Linux操作系统中的gcc编译器来观察一下它们的具体过程
首先我们要知道,整个翻译环境分为编译和链接两个过程,而编译又可以分为 预编译(也叫预处理), 编译汇编三个过程

编译

预编译(预处理)

首先我们通过命令让.c文件预编译一下
在这里插入图片描述
执行完后,就会形成一个test.i 的文件,
我们先来看一下之前.c 文件中有什么内容
编译+链接_第1张图片
我们再看一下预处理后.i文件中有什么内容
编译+链接_第2张图片
其实上边还有很多的内容,对比这两张图片,我们可以看到,预编译过程会进行头文件展开,去掉注释,宏替换等一些文本性的操作
以及所有的预处理指令都是在预处理阶段处理的
编译+链接_第3张图片

编译

下面我们来看一下编译过程都进行了什么,我们还是通过命令先形成一下这个文件
在这里插入图片描述
它就会形成file.s这个文件,我们可以打开这个文件
编译+链接_第4张图片
我们可以看到都是一些汇编代码,也就是说,编译过程将C语言代码生成了汇编指令

汇编

接下来就是汇编这个过程,指令是
在这里插入图片描述
这里的目标文件我们上边说过是二进制文件,我们直接打开肯定是乱码,但是在Linux下gcc编译的目标文件和可执行文件都是按照ELF这种文件的格式来存储的,我们想打开的话也可以
编译+链接_第5张图片
可以看到右下角是我们认识的一些符号,所以汇编过程也会形成符号表

链接

编译过程完成之后,就到了链接过程
编译+链接_第6张图片
这里的file就是我们的可执行文件
所以在链接这个过程,经历了符号表的合并和重定位以及合并段表,因为前边我们可以看到,代码都是分成段去存储
在这里插入图片描述
有这些不同的种类
那么到这里,一个非常简单的从一个C语言文件到可执行文件的过程就说清楚了

你可能感兴趣的:(c++,linux,开发语言,c语言,编译和链接)