首页 > 其他 > 详细

程序从编码到执行经历了什么

时间:2020-04-25 15:14:26      阅读:91      评论:0      收藏:0      [点我收藏+]

1.1 四个步骤

  对于C/C++编写的程序,从源代码到可执行文件,一般经过下面四个步骤:

    1).预处理,产生.ii文件
    2).编译,产生汇编文件(.s文件)
    3).汇编,产生目标文件(.o或.obj文件)
    4).链接,产生可执行文件(.out或.exe文件)
 

 

  • 1.预处理(Preprocessing)

    预处理用于将所有的#include头文件以及宏定义替换成其真正的内容,预处理之后得到的仍然是文本文件,但文件体积会大很多。gcc的预处理是预处理器cpp来完成的,你可以通过如下命令对test.c进行预处理:

gcc -E -I./inc test.c -o test.i

或者直接调用cpp命令

$ cpp test.c -I./inc -o test.i

上述命令中-E是让编译器在预处理之后就退出,不进行后续编译过程;-I指定头文件目录,这里指定的是我们自定义的头文件目录;-o指定输出文件名。

经过预处理之后代码体积会大很多:

预处理之后的程序还是文本,可以用文本编辑器打开。

  • 编译(Compilation)

    这里的编译不是指程序从源文件到二进制程序的全部过程,而是指将经过预处理之后的程序转换成特定汇编代码(assembly code)的过程。编译的指定如下:

$ gcc -S -I./inc test.c -o test.s
  • 汇编(Assemble)

    汇编过程将上一步的汇编代码转换成机器码(machine code),这一步产生的文件叫做目标文件,是二进制格式。gcc汇编过程通过as命令完成:

    等价于
     gcc -c test.s -o test.o

    这一步会为每一个源文件产生一个目标文件。因此mymath.c也需要产生一个mymath.o文件

  • 链接(Linking)

    链接过程将多个目标文以及所需的库文件(.so等)链接成最终的可执行文件(executable file)

    命令大致如下:

      $ ld -o test.out test.o inc/mymath.o ...libraries...

结语

经过以上分析,我们发现编译过程并不像想象的那么简单,而是要经过预处理、编译、汇编、链接。尽管我们平时使用gcc命令的时候没有关心中间结果,但每次程序的编译都少不了这几个步骤。也不用为上述繁琐过程而烦恼,因为你仍然可以:

$ gcc hello.c # 编译
$ ./a.out # 执行

程序从编码到执行经历了什么

原文:https://www.cnblogs.com/shineko/p/12772892.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!