失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 一个C程序的编译过程(Linux环境下Gcc)

一个C程序的编译过程(Linux环境下Gcc)

时间:2021-10-15 22:38:01

相关推荐

一个C程序的编译过程(Linux环境下Gcc)

一 以下是C程序一般的编译过程:

从图中看到:

将编写的一个c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译阶段 和链接这两个阶段。

其中,

1. 编译阶段先通过“编译器“把一个.c / .cpp 源代码编译成 .s的汇编代码;再经过“汇编器” 把这 个.s的汇编代码汇编成.o 的 目标代码

2. “连接器“ 通过连接其他 .o 代码(如果需要的话) 库文件 和 1 中的.o 目标代码生成可执行文件

该文件流被这三种程序(红色)的加工,分别表现出四种形式(蓝色) ,这就是c程序的编译和链接过程。如果再详细的话,编译器在将源文件编译成汇编文件的过程又分为:预处理阶段(生成.i代码) 和 优化阶段

二、C编程中的文件后缀名介绍

.c 未经过预处理的C源码

.h C头文件

.i 经过预处理的C源码

.s 生成的汇编语言代码

.o 编译之后产生的目标文件

解释:*.c一般使我们自己编辑的代码,使我们劳动的结晶;*.h一般是我们手工生成的接口文件,如果愿意,也可在*.c完成后用GCC的选项-aux-info帮我们生成;*.i是经过预处理后的源码,是由GCC在选项-E编译下自动生成的文件;*.o是编译后产生的目标文件;*.s是GCC在选项-S编译下生成的汇编语言代码,对于性能要求很高的程序可以先生成汇编语言文件并对汇编做优化,然后用优化后的汇编生成目标文件并链接

三演示 hello.c的编译过程(Linux 下 Gcc)

本小节的演示都针对文件 hello.c 进行

1. /*

2. * hello.c

3. */

4.

5. #include <stdio.h>

6. int main()

7. {

8. printf("Better goal, Better life!/n");

9. return 0;

10. }

1.生成预处理后的文件 hello.i

$gcc -E hello.c -o hello.i

2.生成汇编语言文件 hello.s

$gcc -s hello.i -o hello.s

3.生成目标文件 hello.o

$ gcc -c hello.i

$ gcc -c hello.s

4.生成可执行文件

$ gcc -ohellohello.o

5.运行及结果

$./hello

Better goal, Better life!

当然也可以直接生成, $gcc -c hello.c就可以生成可执行文件。这是Gcc内部的事。但就算是跳跃也要经过一步步的翻译,原理是相似的,万变不离其宗!

如果觉得《一个C程序的编译过程(Linux环境下Gcc)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。