ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-06-02 17:31:40  阅读:185  来源: 互联网

标签:文件 gcc openeuler 编译 华为 openEuler root hello


利用华为云鲲鹏系统的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打开程序

image-20220602165855937
  • 按键盘上i键进入insert模式,按esc退出insert模式,输入:wq退出编辑器

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

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有