其他分享
首页 > 其他分享> > 利用华为云鲲鹏系统的openEuler来看一下hello.c的编译过程

利用华为云鲲鹏系统的openEuler来看一下hello.c的编译过程

作者:互联网

利用华为云鲲鹏系统的openEuler来看一下hello.c的编译过程

目录

既然都做到这里了(指在运行完第一个程序之后)想偷偷多做一点事情,想研究一下它的编译过程

-E 文件预处理(进行宏替换)

选项 “-E”, 该选项的作用是让 gcc 在预处理结束后停止编译过程。

预处理功能主要包括宏定义, 文件包含, 条件编译, 去注释等。预处理指令是以 # 号开头的代码行。

这句话的意思就是把那堆 #后面的内容换成原来文件中的内容,等一下会试着看一下//或这种/**/注释里面的内容在编译的过程中会变成上面。

-o 指向目标文件

选项 “-o” 是指目标文件 ,“.i” 文件为已经过预处理的 C 原始程序。

-S 生成汇编文件

在这个阶段中 ,gcc 首先要检查代码的规范性、是否有语法错误等 , 以确定代码的实际要做的工作 , 在检查无误后,gcc 把代码翻译成汇编语言。用户可以使用 “-S” 选项来进行查看 , 该选项只进行编译而不进行汇编 , 生成汇编代码。

[root@openeuler hello]# gcc -S hello.i -o hello.s
[root@openeuler hello]# ls
a.out  hello.c  hello.i  hello.s

-c 汇编

汇编阶段是把编译阶段生成的 “.s” 文件转成目标文件,用户在此可使用选项 “-c” 就可看到汇编代码已转化为 “.o” 的二进制目标代码。

[root@openeuler hello]# gcc -c hello.s -o hello.o
[root@openeuler hello]# ls
a.out  hello.c  hello.i  hello.o  hello.s

-o 链接

在成功编译之后 , 就进入了链接阶段(但其实我也不知道链接有啥作用,为了名字好看?)。

[root@openeuler hello]# ./hello.o
-bash: ./hello.o: Permission denied
[root@openeuler hello]# gcc hello.o -o hello
[root@openeuler hello]# ls
a.out  hello  hello.c  hello.i  hello.o  hello.s
[root@openeuler hello]# ./hello
Hello world![root@openeuler hello]#

其实这里我们可以看出来,链接是缺一不可的,它的作用是将机器码(也就是二进制语言)链接到一起生成可执行程序,这一步会对文件之间的关联做检查,如果出错,将不会生成可执行程序,也就无法执行。

也发现了上面./hello的意思和./a.out的意思其实是一样的

编译小结

执行顺序 1 2 3 4 5
文件名 hello.c hello.i hello.s hello.o hello
意义 C语言程序 预处理文件 汇编文件 二进制文件 可执行程序

MORE

vi hello.c一个编辑器vi打开程序

image-20220602165855937

查看注释内容会到底被替换成什么呢?

image-20220602170801695

结果是在预处理文件中根本找不到了,也就是说在预处理的过程中它自动帮我们去掉注释了,或者说替换成NULL字符了

image-20220602171353990

本文参考

C语言编辑编译连接的作用是什么_百度知道 (baidu.com)

(127条消息) Linux编译器—gcc的使用_一个达布刘(o゚v゚)ノ的博客-CSDN博客_gcc

标签:文件,gcc,openeuler,编译,华为,openEuler,root,hello
来源: https://www.cnblogs.com/Linkdom/p/16338503.html