【C语言笔记】C语言编译的过程

1、前言

如果你使用的是集成开发环境,那么你点击编译按钮就可生成可执行文件,然后点击运行即可运行。那么,你知道从源代码到可执行文件经历了哪些过程吗。仅仅是编译?

下面以windows环境下的test.c为例,test.c里的代码为:

#include <stdio.h>
int main(void)
{
 printf("This is a test program!\n");
 return 0;
}

其经历如下过程:

如图,编译生成可执行文件的过程实际包含四个过程:(1)预处理;(2)编译;(3)汇编;(4)链接。

2、预处理(Preprpcessing)

使用预处理器把源文件test.c经过预处理生成test.i文件,预处理用于将所有的#include头文件以及宏定义替换成其真正的内容。

预处理的命令为:

gcc -E test.c -o test.i

上述命令中-E是让编译器在预处理之后就退出,不进行后续编译过程;-o是指定输出文件名。

预处理之后得到的仍然是文本文件。test.i文件部分内容截图如下:

3、编译(Compilation)

使用编译器将预处理文件test.i编译成汇编文件test.s

编译的命令为:

gcc -S test.i -o test.s

上述命令中-S让编译器在编译之后停止,不进行后续过程;-o是指定输出文件名。汇编文件test.s是文本文件,部分内容截图如下:

4、汇编(Assemble)

使用汇编器将汇编文件test.s转换成目标文件test.o

汇编过程的命令为:

gcc -c test.s -o test.o

上述命令中-c-o让汇编器把汇编文件test.s转换成目标文件test.o。目标文件test.o是二进制文件,部分内容截图如下:

5、链接(Linking)

链接过程使用链接器将该目标文件与其他目标文件、库文件、启动文件等链接起来生成可执行文件。

链接过程的命令为:

gcc test.o -o test.exe

综上,生成可执行程序过程为:预处理、编译、汇编、链接。各个命令如下图所示:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏go语言核心编程技术

go语言调度器源代码情景分析之二:CPU寄存器

寄存器是CPU内部的存储单元,用于存放从内存读取而来的数据(包括指令)和CPU运算的中间结果,之所以要使用寄存器来临时存放数据而不是直接操作内存,一是因为CPU...

12440
来自专栏go语言核心编程技术

go语言调度器源代码情景分析之三:内存

内存由大量内存单元组成,内存单元大小为1个字节(1字节包含8个二进制位), 每个内存单元都有一个编号,更专业的说法是每一个内存单元都有一个地址,我们在编写汇编代...

10230
来自专栏逆向技术

x64汇编第四讲,c / C++中调用x64汇编

在x86下,我们的C/C++调用汇编可以直接 __asm进行内联. 或者也可以直接静态链接

25210
来自专栏go语言核心编程技术

go语言调度器源代码情景分析之六:go汇编语言

go语言runtime(包括调度器)源代码中有部分代码是用汇编语言编写的,不过这些汇编代码并非针对特定体系结构的汇编代码,而是go语言引入的一种伪汇编,它同样也...

14330
来自专栏IT大咖说

雷军的贵人,剑网3,WPS,武当弟子:求伯君传奇

1991年11月4日,在一个计算机展览会上,求伯君和雷军第一次相遇,求伯君邀请雷军加入公司,雷军从武汉大学毕业创立公司刚失败,正好有这个机会就加入了,雷军回忆说...

19820
来自专栏逆向技术

x64汇编第三讲,64位调用约定与函数传参.

1.传参方式 首先说明一下,在X64下,是寄存器传参. 前4个参数分别是 rcx rdx r8 r9进行传参.多余的通过栈传参.从右向左入栈. 2.申请参数...

26320
来自专栏go语言核心编程技术

go语言调度器源代码情景分析之五:汇编指令

汇编语言是每位后端程序员都应该掌握的一门语言,因为学会了汇编语言,不管是对我们调试程序还是研究与理解计算机底层的一些运行原理都具有非常重要的作用,所以建议有兴趣...

15420
来自专栏诸葛青云的专栏

C语言编译器为什么能够用C语言编写?

所谓C语言编译器,就是把编程得到的文件,比如.c,.h的文件,进行读取,并对内容进行分析,按照C语言的规则,将其转换成cpu可以执行的二进制文件。

23200
来自专栏go语言核心编程技术

深入理解defer(上)defer基础

f() 函数首先通过调用 getResource() 获取了某种资源(比如打开文件,加锁等),然后进行了一些我们不太关心的操作,但这些操作可能会导致 f() ...

9220

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励