Linux gcc编译的过程

GCC(GNU Compiler Collection)是一个开源的编译器集合,用于编译C、C++、Fortran等语言的代码。以下是使用GCC编译C程序时的主要步骤:

1. 预处理(Preprocessing):
    - 这个阶段处理源代码中的预处理器指令,例如`#include`、`#define`等。
    - 扩展源文件中包含的所有头文件。
    - 处理条件编译指令,如`#ifdef`、`#ifndef`等。
    - 将宏替换为其定义的值。
    - 去除所有的注释。
    - 最终生成一个“展开”的源文件。

2.编译(Compilation):
    - 在这个阶段,GCC将预处理后的源代码转换为汇编语言。
    - 这是你的程序第一次转换为机器语言,但它仍然是人类可读的格式。
    - 此步骤会检查代码中的语法错误。

3. 汇编(Assembly):
    - 汇编器(通常称为`as`)将编译阶段生成的汇编代码转换为机器语言代码,这些代码被打包为一个格式叫做“目标文件”。
    - 目标文件是一个二进制文件,它包含了你的程序的机器码,但还没有链接到可以执行的程序。

4. 链接(Linking):
    - 在这个阶段,链接器(`ld`)将一个或多个目标文件与必要的库文件一起链接,生成一个可执行文件。
    - 链接器解决了所有的外部函数和变量的引用,并确保它们都链接到正确的位置。
    - 生成的可执行文件可以在操作系统上直接运行。

        每一步都可以独立地使用GCC命令来执行。例如,你可以只预处理源文件,只编译而不链接,或者只链接预先编译的目标文件。

       在日常使用中,开发者通常会一次完成所有的步骤来生成一个可执行文件。

       使用GCC,可以手动控制编译过程的各个阶段。

1. 预处理(Preprocessing):
   

gcc -E source.c -o source.i


         这将产生一个预处理后的文`source.i。-E标志会告诉GCC停止在预处理阶段。

2. 编译(Compilation):

    gcc -S source.i -o source.s

        这将编译预处理后的`source.i`并生成一个汇编文件`source.s`。`-S`标志会告诉GCC编译但不进行汇编。

3.汇编(Assembly):

    as source.s -o source.o

或者

    gcc -c source.s -o source.o


        这将汇编source.s并生成一个目标文件source.o。-c标志告诉GCC进行编译和汇编,但不进行链接。

4. 链接(Linking):

    gcc source.o -o executable


        这将链接source.o并生成一个名为executable的可执行文件。

        这些步骤分开执行主要用于教学或调试目的。在日常的开发中,你通常会使用一条GCC命令来完成整个编译和链接过程,如:

gcc source.c -o executable

这会自动执行所有的阶段并生成一个可执行文件。

猜你喜欢

转载自blog.csdn.net/qq_52119661/article/details/132363571