C语言hello work的编译过程分解

  • hello world编译全过程
    • 预编译
    • 编译
    • 汇编
    • 链接

hello world编译全过程

下面用一个最简单的程序去熟悉程序(.c或.cpp文件)在编译成可执行文件(a.out)需要经历那些过程。

//file name "hello.c"
#include<stdio.h>
int main()
{printf("hello world\n");return 0
}
$ gcc hello.c
$./a.out

在Linux下,使用GCC来编译程序时,只需要一条命令(gcc)就可以得到我们想要的可执行文件(a.out)。

其实,展开来看,这个过程可以分为4个步骤,分别是预处理编译汇编链接

预编译

预编译过程主要处理代码中以"#“开始的预编译指令。例如” #include “、” #define “、” #ifdef “、” endif "等。

其实就是将所有的宏定义展开。例如#include<stdio.h>就是将stdio.h文本内容复制到hello.c中展开。

预编译后的文件扩展名为" .i "。使用工具是预编译器cpp。

编译

编译过程就是把预处理完的文件进行一系列的词法分析、语法分析、语义分析以及优化后生产相应的汇编代码文件。简单理解就是将C/C++语言“翻译”成汇编。

编译后的文件扩展名为" .s "。使用工具是gcc,不过gcc命令只是很多后台程序的包装,该步骤应该使用的是编译程序ccl。

汇编

汇编过程就是将汇编代码转变成机器可以执行的机器指令,因为CPU只能识别机器指令,这些可执行的指令的集合就是目标文件。以上过程的C语言和汇编语言都是一种高级语言,最后通过层层“翻译”变成机器指令CPU才能识别并执行。

汇编后的文件扩展名为" .o "。使用工具是汇编器as。

链接

链接就是将各个源代码(.c)模块单独编译成目标文件(.o)组装起来,使各个模块之间相互引用的部分正常工作。链接可以分为静态链接和动态链接。

链接后的文件就是可执行文件(a.out)。使用工具是链接器ld。

参考文件
[1] 俞甲子,石凡,潘爱民.程序员的自我修养——链接、装载与库[M].北京:电子工业出版社,2009.4

C语言hello work的编译过程分解相关推荐

  1. -i 可以编译添加多个_C语言的编译过程

    大家对C语言的编译过程可能有个大致的理解,但是,详细到每一步具体都干了啥,可能有的人不是很清楚啦,也包括我,要不然,就不会做笔记了,哈哈... 0.主要步骤 ① 步骤 编写源程序(.c) → 预处理 ...

  2. gcc编译c文件_Linux下C语言程序的编译过程

    Linux下C语言程序的编译过程 使用gcc编译程序时,编译工程分为4个阶段: (1)预处理:(Pre-Processing) (2)编译:(Compiling) (3)汇编:(Assembling) ...

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

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

  4. C语言编译过程总结详解

    C语言的编译链接过程要把我们编写的一个c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接.编译就是把文本形式源代码翻译为机器语言形式的目标文件的过程.链接是把目标文件.操作 ...

  5. GCC 使用-C语言编译过程

    任何一种高级语言,要想在机器上执行,必须翻译为机器能读懂的机器语言.编译器就相当于翻译官,将高级语言翻译为机器语言. GCC 最初只用了编译 C 语言程序,全称是 GNU C Compiler.后来扩 ...

  6. c语言的详细编译过程

    gcc编译c语言的整个编译过程可分为预编译->编译->汇编->链接 我们先编辑一个name.c文件 1 # include<stdio.h> 2 int main(int ...

  7. Go 语言编译过程概述

    Golang 是一门需要编译才能运行的编程语言,也就说代码在运行之前需要通过编译器生成二进制机器码,随后二进制文件才能在目标机器上运行,如果我们想要了解 Go 语言的实现原理,理解它的编译过程就是一个 ...

  8. C语言学习笔记---001C语言的介绍,编译过程原理,工具等

    C语言学习笔记---001C语言的介绍,编译过程原理,工具等 创梦技术交流平台:资源下载,技术交流,网络赚钱: 交流qq群:1群:248318056 2群:251572072 技术交流平台:cre.i ...

  9. c语言的编译过程,从文本到可执行文件

    从文本文件到可执行文件 以hello world举例. #include<stdio.h> int main(){printf("hello,world!\n");re ...

最新文章

  1. linux2.0版本发布时间,Ubuntu 20.04 LTS发布时间表公布 4月23日放出最终稳定版
  2. 中文速读微生物组(宏基因组)前沿文献——这个可以有
  3. Jvm 系列(七):Jvm 调优-工具篇
  4. GitHub高效搜索
  5. matlab能修图吗,相机上这个“功能”,不打开会影响修图效果,别等拍完照片才知道...
  6. 【响应式Web前端设计】Bootstrap入门Demo(导航栏)
  7. Python 技术篇-1行代码实现语音识别,speech库快速实现简单的语音对话
  8. SwingC API 演示DEMO,不断更新
  9. Ajax-基本概述(one)
  10. python输入一个字母_python – Tkinter输入的第一个字母
  11. 乐在其中设计模式(C#) - 原型模式(Prototype Pattern)
  12. Python 分布式文件系统 Mongodb GridFS
  13. 递增子序列 Increasing Subsequences
  14. 中职计算机英语课件ppt,语文版中职英语(基础模块 上册)Unit 7《Computers》ppt课件1.ppt...
  15. Eclipse使用常见设置
  16. paip. VS2010版本控制tfs使用总结
  17. SpringApplication#run⽅法第5步,打印banner(四)
  18. 虚拟机体验NAS私人云全揭秘:深度揭秘虚拟机安装群晖DSM6.2/6.2.1/6.2.2/6.2.3系统洗白全过程(附赠洗白码)
  19. Pandas一键爬取解析代理IP与代理IP池的维护
  20. python google earth_如何用python编程控制GoogleEarth

热门文章

  1. solaris linux nfs,solaris 10 nfs服务配置
  2. x86系统MySQL_deepin20.1系统安装MySQL8.0.23(最美国产Liunx系统,最新,最详细的MySQL8安装教程)...
  3. android10新功能,Android10(Api 29)新特性
  4. 自注意力机制_与SENet互补提升,华为诺亚提出自注意力新机制:Weight ExcitationECCV2020...
  5. 【windows】windows允许 ICMP协议(允许ping)
  6. 【debug】moduleNotFoundError:No module named 'exceptions'
  7. Oracle 实验5 视图与索引
  8. 电脑上的linux是什么文件夹,linux删除文件夹,详细教您电脑的linux怎么样删除文件夹...
  9. 小程序分享到朋友圈功能_小程序开发日记 分享到朋友圈
  10. matlab出如何从fig中获取数据,如何从MATLAB的fig文件中提取原始数据?