C语言编译过程详解

C语言程序从源代码到二进制经历了4个过程:

1.预处理
2.编译
3.汇编
4.链接

文件cc.c如下:

#include 

#define CC 5

int main()
{
    int T;
    
    T = CC;
    printf("hello world!!!\r\n");
    return 0;
}

1.预处理(Preprocessing) .c->.i

1.展开头文件

2.替换宏定义内容

3.去注释

4.条件编译

备注:编译生成的还是文本文件,只是生成的文件会变大,下面是两种方式。

gcc -E cc.c -o cc.i 
cpp cc.c -o cc.i

备注:这里的-E代表让编译器在预处理之后就退出

如下图,左边是原始文件cc.c,右边是生成文件cc.i

 C语言编译过程详解_第1张图片

2.编译(Compilation) .i->.s

指经过预处理之后的程序转换成特定汇编代码

gcc -S cc.c -o cc.s

-S指让编译器在编译之后停止,不执行后续过程,生成汇编代码cc.s

将C程序的指令和数据分开,分别映射到不同的程序段中

3.汇编(Assemble) .s->.o

指经过编译生成的汇编代码转换成机器文件(二进制),下面有两种方式

as cc.s -o cc.o
gcc -c cc.s -o cc.o 

备注:为每一个源文件产生一个目标文件

4.链接(Linking) *.o *.so->可执行文件

将多个目标文件以及所需的库文件链接成最终的可执行文件

ld -o cc.out cc.o ...libraries...

结语

由源代码最终生成可执行文件的过程:

.c-预处理>.i-编译>.s-汇编>.o+.so-链接>可执行文件

可以合并成一步:

gcc cc.c
./a.out

最终生成的可执行文件默认为a.out

你可能感兴趣的:(c语言,开发语言,后端)