C语音的预处理,编译,汇编,链接过程分析

C语音的预处理,编译,汇编,链接过程分析

1.C程序编译分为以下几步:

  • 预处理 (生成 .i文件)
  • 编译(生成 .s文件)
  • 汇编(生成 .o文件)
  • 链接(生成 .exe文件)

2.通过图解来理解编译过程

在这里插入图片描述

3.通过Linux的gcc编译C文件,并逐步分析:

vim test.c      //Linux指令
//test.c只写一个简单的hello world
#include<stdio.h>
#include<stdlib.h>
int main (){
	printf("hello world!!!\n");
	return 0;
}

//预处理过程
gcc -E test.c -o test.i     //Linux指令 生成.i文件
ls //查看文件

在这里插入图片描述

​ 通过图片我们可以知道我们预处理过程生成了test.i文件,现在我们再通过Linux指令查看其内容。

cat test.i	 //文本格式输出内容
vim test.i   //文本编辑器打开

在这里插入图片描述

//可以看到原来的include语句那里被大量其他的代码代替
//这就是预处理过程,预处理过程会把include的头文件引入到代码头部

gcc -S test.i -o test.s     //编译过程(生成.s文件)
vim test.s   //打开看看内容

在这里插入图片描述

​ 这里记录了变量等各种信息,这是通过编译生成的汇编语言。后面需要通过汇编对其进行解释,并生成目标文件。

gcc -c test.s -o test.o     //汇编过程(生成.o文件,也就是目标文件)
cat test.o   //查看内容(会发现一堆乱码)

在这里插入图片描述

//只所有会生成一堆乱码是因为这是.o文件已经是二进制文件,所有以文本输出是一堆乱码。
/*为什么已经是二进制文件了,还不能执行文件呢?这是因为这只是针对你编写的C文件编译出来的目标文件,并不是最终的可执行文件,要变成可执行文件,还需要本地的机器指令库。而这个工作就是链接了。
*/

gcc test.o -o test    //最后一步链接本地库,最终会生成可执行文件(.exe文件)

在这里插入图片描述

4.关于其他目标文件

​ 在C中可以通过extern关键字,声明一个外部全局变量或者函数。这些变量和函数可能会存在其他C文件中,所有,在链接过程会用到其他目标文件。因为编译器是一单个C文件进行编译的,所以在用其他C文件用的全局变量时必须把其他的C文件也编译成目标文件并用链接器进行连接,才能使用到外部的全局变量。
为编译器是一单个C文件进行编译的,所以在用其他C文件用的全局变量时必须把其他的C文件也编译成目标文件并用链接器进行连接,才能使用到外部的全局变量。

猜你喜欢

转载自blog.csdn.net/qq_43203949/article/details/105398952
今日推荐