zoukankan      html  css  js  c++  java
  • C程序编译过程

    gcc命令依次执行了四步操作:1.预处理(Preprocessing), 2.编译(Compilation), 3.汇编(Assemble), 4.链接(Linking)。

    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指定输出文件名。

    经过预处理之后代码体积会大很多,预处理之后的程序还是文本,可以用文本编辑器打开。

    2.编译(Compilation)

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

    $ gcc -S -I./inc test.c -o test.s

    上述命令中-S让编译器在编译之后停止,不进行后续过程。

    编译过程完成后,将生成程序的汇编代码test.s,这也是文本文件。

    3.汇编(Assemble)

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

    $ as test.s -o test.o

    等价于:

    gcc -c test.s -o test.o

    这一步会为每一个源文件产生一个目标文件

    因此mymath.c也需要产生一个mymath.o文件

    4.链接(Linking)

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

    命令大致如下:

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

    结语

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

    参考文献

    https://www.cnblogs.com/knife-king/p/11090029.html

  • 相关阅读:
    [NOI2005]维护数列——Splay
    [Poi2000]病毒——补全AC自动机
    POJ1509 Glass Beads——SAM(后缀自动机)
    「NOI2011」阿狸的打字机——AC自动机+树状数组
    7.12Test——Graph Theory 1
    [BJWC2010]严格次小生成树
    7.09Test——DS1
    [SCOI2015]小凸想跑步——半平面交
    词频统计器(第三版)
    四则运算(测试)
  • 原文地址:https://www.cnblogs.com/covei/p/13856218.html
Copyright © 2011-2022 走看看