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语音的预处理,编译,汇编,链接过程分析相关推荐

  1. 【C 语言】编译过程 分析 ( 预处理 | 编译 | 汇编 | 链接 | 宏定义 | 条件编译 | 编译器指示字 )

    相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...

  2. C语言 程序的翻译 预处理 编译 汇编 链接 #define详解

    1.程序的翻译环境和执行环境 执行环境:所在操作系统的平台 win10 win11 linux 翻译环境:MSVC gcc g++ 你的vs 2019 和2022 是集成开发环境把编辑器编译器全部给你 ...

  3. stm32启动过程、cortex-m3架构、堆栈代码位置、编译汇编链接分析

    分析 一. 寄存器.架构.工作流程 1. 寄存器架构 二 .总线与各个部件之间的关系(主要是I-Code Bus.D-Code Bus.System Bus) 体系结构:哈佛结构与冯诺依曼结构的区别 ...

  4. 反编译与反汇编、C++编译过程,包括预编译--汇编--编译--链接

    参考:C/C++程序编译流程(预处理->编译->汇编->链接) - ProLyn - 博客园 反汇编和反编译的区别_代码小卒_新浪博客 反汇编与反编译: 汇编:是把汇编源程序转变为目 ...

  5. 使用gcc编译和链接C语言程序,用GCC编译链接程序--编译链接器GCC常用功能(菜鸟级)...

    转载自:http://daimajishu.iteye.com/blog/1089740 对gcc认识的一篇文章,就转载了,截取了自己感兴趣部分. 一,GCC编译器简介 虽然我们称Gcc是C语言的编译 ...

  6. c语言编辑编译链接,C语言的“编译、链接”

    我们写的代码,仅仅是文本文件(txt),不管后缀怎么变,终究是文本文件,计算机只能显示,不能做事(执行). 文本文件通过"编译.链接",成为可执行文件(windows下是exe): ...

  7. 程序的编译与链接、预处理符号、指令

    程序的编译与链接 1.程序编译 组成一个程序的每个源文件通过编译过程分别转换成目标代码(object code). 每个目标文件由链接器(linker)捆绑在一起,形成一个单一而完整的可执行程序. 链 ...

  8. C语言拯救者(程序的预处理、编译、链接与宏- -15)

    注:由于VS2019是集成开发环境,不方便观察细节.我们使用Linxu gcc来演示编译和链接 目录 1. 程序的翻译环境和执行环境 2. 编译和链接 2. 编译的几个阶段 2.1 预编译(预处理): ...

  9. 【C语言关键知识点1】C语言的预处理、编译和链接过程

    1 引言   再一次回顾C语言的关键基础知识,今天带大家深刻的剖析一下C语言的预处理.编译(汇编)和链接的过程,以加深对C语言及编程本质的理解!   学习C语言首先要理解的就是如何将程序员输入的源代码 ...

最新文章

  1. JavaScript基础初始时期分支(018)
  2. 把共享库(SO)加载到指定的内存地址
  3. 关于arm-linux-gcc的安装与配置
  4. python调用shell脚本
  5. 信息学奥赛一本通(1051:分段函数)
  6. Ubuntu下安装Rabbitmq和golang环境
  7. 计算机英语评价,关于计算机专业英文自我评价
  8. python文件夹遍历_Python练习6-文件遍历
  9. Jedis连接数据库
  10. 【漏洞分析】dedecms有前提前台任意用户密码修改
  11. logit回归模型假设_LOGISTIC回归分析
  12. 安装linux需要最少磁盘分区是多少,320G硬盘只安装Linux分区方案
  13. linux下创建桌面快捷方式,简单快捷(ubuntu)
  14. LoRa 信噪比和接收灵敏度
  15. Visio 导出图片时字符间距错乱
  16. [NOIP2020] 微信步数
  17. 同一局域网下 macOS 和 windows 电脑 如何快速共享文件
  18. 无监督特征学习(半监督学习+自学习)
  19. 【STM32H7教程】第87章 STM32H7的SDMMC总线基础知识和HAL库API
  20. 腾讯企业邮箱 java_使用腾讯企业邮箱调用SpringMail或者JavaMail发送邮件的发送服务器设置...

热门文章

  1. 被忽视但很实用的那部分SQL
  2. EhCache的配置
  3. 3.2.5 四则运算的例子
  4. WebBrowser脚本错误的完美解决方案
  5. Namespace declaration statement has to be the very first statement in the script
  6. 在sql server2000的查询分析器里查询oracle的数据
  7. 异星工厂 自动机器人_插件机机器人能够实现工厂自动化
  8. stream 的方式遍历(亲测)
  9. mysql格式化小数保留小数点后两位(小数点格式化)
  10. Thinkphp下嵌套UEditor富文本WEB编辑器