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文件也编译成目标文件并用链接器进行连接,才能使用到外部的全局变量。

posted @   鸭梨的药丸哥  阅读(35)  评论(0编辑  收藏  举报  
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示