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文件也编译成目标文件并用链接器进行连接,才能使用到外部的全局变量。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)