利用华为云鲲鹏系统的openEuler来看一下hello.c的编译过程
作者:互联网
利用华为云鲲鹏系统的openEuler来看一下hello.c的编译过程
目录既然都做到这里了(指在运行完第一个程序之后)想偷偷多做一点事情,想研究一下它的编译过程
-
#include<stdio.h> int main(){ printf("Hello world!"); }
-
随便写了一个hello.c看一下编译过程
-
首先在原来的test文件夹里又新建了一个hello文件夹,并把hello.c复制到里面;
-
输入命令
[root@openeuler ~]# cd test [root@openeuler test]# cd hello [root@openeuler hello]# gcc hello.c [root@openeuler hello]# ls a.out hello.c [root@openeuler hello]# ./a.out Hello world![root@openeuler hello]#
-
甚至都没有换行,只是产生了一个a.out文件
-
现在来试试具体-o -E 这种命令的意思
-
-E 文件预处理(进行宏替换)
选项 “-E”, 该选项的作用是让 gcc 在预处理结束后停止编译过程。
预处理功能主要包括宏定义, 文件包含, 条件编译, 去注释等。预处理指令是以 # 号开头的代码行。
这句话的意思就是把那堆 #后面的内容换成原来文件中的内容,等一下会试着看一下//或这种/**/注释里面的内容在编译的过程中会变成上面。
-
gcc –E hello.c
输入了这句话,但没有指定输出的目标,就输出了gcc预处理后的一大堆编译后的输出
-o 指向目标文件
选项 “-o” 是指目标文件 ,“.i” 文件为已经过预处理的 C 原始程序。
-
所以应该这样输入
[root@openeuler hello]# gcc -E hello.c -o hello.i [root@openeuler hello]# ls a.out hello.c hello.i
-
这样我们实现了第一步,从我们写的C程序到预处理文件,hello.c->hello.i,也就是进行了宏替换(预处理)
-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
- 这样我们实现了第二步,从预处理文件到汇编文件,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
- 这样我们实现了第三步,从汇编文件到二进制文件,hello.s->hello.o,也就是换成了机器可以懂的语言
-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.o->hello
其实这里我们可以看出来,链接是缺一不可的,它的作用是将机器码(也就是二进制语言)链接到一起生成可执行程序,这一步会对文件之间的关联做检查,如果出错,将不会生成可执行程序,也就无法执行。
也发现了上面./hello
的意思和./a.out
的意思其实是一样的
编译小结
执行顺序 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
文件名 | hello.c | hello.i | hello.s | hello.o | hello |
意义 | C语言程序 | 预处理文件 | 汇编文件 | 二进制文件 | 可执行程序 |
MORE
vi hello.c
一个编辑器vi打开程序
- 按键盘上
i
键进入insert模式,按esc
退出insert模式,输入:wq
退出编辑器
查看注释内容会到底被替换成什么呢?
结果是在预处理文件中根本找不到了,也就是说在预处理的过程中它自动帮我们去掉注释了,或者说替换成NULL字符了
本文参考
C语言编辑编译连接的作用是什么_百度知道 (baidu.com)
(127条消息) Linux编译器—gcc的使用_一个达布刘(o゚v゚)ノ的博客-CSDN博客_gcc
标签:文件,gcc,openeuler,编译,华为,openEuler,root,hello 来源: https://www.cnblogs.com/Linkdom/p/16338503.html