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文件也编译成目标文件并用链接器进行连接,才能使用到外部的全局变量。
C语音的预处理,编译,汇编,链接过程分析相关推荐
- 【C 语言】编译过程 分析 ( 预处理 | 编译 | 汇编 | 链接 | 宏定义 | 条件编译 | 编译器指示字 )
相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...
- C语言 程序的翻译 预处理 编译 汇编 链接 #define详解
1.程序的翻译环境和执行环境 执行环境:所在操作系统的平台 win10 win11 linux 翻译环境:MSVC gcc g++ 你的vs 2019 和2022 是集成开发环境把编辑器编译器全部给你 ...
- stm32启动过程、cortex-m3架构、堆栈代码位置、编译汇编链接分析
分析 一. 寄存器.架构.工作流程 1. 寄存器架构 二 .总线与各个部件之间的关系(主要是I-Code Bus.D-Code Bus.System Bus) 体系结构:哈佛结构与冯诺依曼结构的区别 ...
- 反编译与反汇编、C++编译过程,包括预编译--汇编--编译--链接
参考:C/C++程序编译流程(预处理->编译->汇编->链接) - ProLyn - 博客园 反汇编和反编译的区别_代码小卒_新浪博客 反汇编与反编译: 汇编:是把汇编源程序转变为目 ...
- 使用gcc编译和链接C语言程序,用GCC编译链接程序--编译链接器GCC常用功能(菜鸟级)...
转载自:http://daimajishu.iteye.com/blog/1089740 对gcc认识的一篇文章,就转载了,截取了自己感兴趣部分. 一,GCC编译器简介 虽然我们称Gcc是C语言的编译 ...
- c语言编辑编译链接,C语言的“编译、链接”
我们写的代码,仅仅是文本文件(txt),不管后缀怎么变,终究是文本文件,计算机只能显示,不能做事(执行). 文本文件通过"编译.链接",成为可执行文件(windows下是exe): ...
- 程序的编译与链接、预处理符号、指令
程序的编译与链接 1.程序编译 组成一个程序的每个源文件通过编译过程分别转换成目标代码(object code). 每个目标文件由链接器(linker)捆绑在一起,形成一个单一而完整的可执行程序. 链 ...
- C语言拯救者(程序的预处理、编译、链接与宏- -15)
注:由于VS2019是集成开发环境,不方便观察细节.我们使用Linxu gcc来演示编译和链接 目录 1. 程序的翻译环境和执行环境 2. 编译和链接 2. 编译的几个阶段 2.1 预编译(预处理): ...
- 【C语言关键知识点1】C语言的预处理、编译和链接过程
1 引言 再一次回顾C语言的关键基础知识,今天带大家深刻的剖析一下C语言的预处理.编译(汇编)和链接的过程,以加深对C语言及编程本质的理解! 学习C语言首先要理解的就是如何将程序员输入的源代码 ...
最新文章
- JavaScript基础初始时期分支(018)
- 把共享库(SO)加载到指定的内存地址
- 关于arm-linux-gcc的安装与配置
- python调用shell脚本
- 信息学奥赛一本通(1051:分段函数)
- Ubuntu下安装Rabbitmq和golang环境
- 计算机英语评价,关于计算机专业英文自我评价
- python文件夹遍历_Python练习6-文件遍历
- Jedis连接数据库
- 【漏洞分析】dedecms有前提前台任意用户密码修改
- logit回归模型假设_LOGISTIC回归分析
- 安装linux需要最少磁盘分区是多少,320G硬盘只安装Linux分区方案
- linux下创建桌面快捷方式,简单快捷(ubuntu)
- LoRa 信噪比和接收灵敏度
- Visio 导出图片时字符间距错乱
- [NOIP2020] 微信步数
- 同一局域网下 macOS 和 windows 电脑 如何快速共享文件
- 无监督特征学习(半监督学习+自学习)
- 【STM32H7教程】第87章 STM32H7的SDMMC总线基础知识和HAL库API
- 腾讯企业邮箱 java_使用腾讯企业邮箱调用SpringMail或者JavaMail发送邮件的发送服务器设置...
热门文章
- 被忽视但很实用的那部分SQL
- EhCache的配置
- 3.2.5 四则运算的例子
- WebBrowser脚本错误的完美解决方案
- Namespace declaration statement has to be the very first statement in the script
- 在sql server2000的查询分析器里查询oracle的数据
- 异星工厂 自动机器人_插件机机器人能够实现工厂自动化
- stream 的方式遍历(亲测)
- mysql格式化小数保留小数点后两位(小数点格式化)
- Thinkphp下嵌套UEditor富文本WEB编辑器