前言

       相信能看到这篇文章的同学,是对C语言很热爱的人。

       最开始学习C语言的时候,我们大多数人都是用集成开发环境,VS、VC、devc++等。

       当我们把C语言源代码写好了之后,在集成开发工具中这里点一下,哪里点一下,代码就跑起来了,这种快乐的感觉的确是对初学者的一种最好的鼓励,可是,你别忘记了,我们要做一个资深的程序员,知其所以然是必不可少的,下面我就带大家了解一下我们编写的C语言源文件(.c)到底是如何一步步变成可执行文件(.exe/.elf) 的

过程

四个过程:

        预处理(-E):展开 .h、宏定义等,形成 .i 文件;

        编译(-S):生成一个汇编代码文件,形成 .s 文件;

        汇编(-c):汇编过程将上一步的汇编代码转换成机器码(machine code),这一步产生的文件叫做目标文件,是二进制格式,形成 .o 文件。

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

        友情提示:注意大小写,要不然你会报错的。

代码演示

.c 源代码

#include<stdio.h>
#include<stdlib.h>

#define STR "Hello World"

int main()
{
    printf(STR);
    return 0;
}

预处理(-E):展开 .h、宏定义等,形成 .i 文件;

gcc -E hello.c -o hello.i

微观的C/C++编译执行过程_编译器

编译(-S):生成一个汇编代码文件,形成 .s 文件;

gcc -S hello.i -o hello.s

微观的C/C++编译执行过程_目标文件_02

汇编(-c):汇编过程将上一步的汇编代码转换成机器码(machine code),这一步产生的文件叫做目标文件,是二进制格式,形成 .o 文件。

gcc -c hello.s -o hello.o

微观的C/C++编译执行过程_目标文件_03

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

gcc hello.o -o hello

微观的C/C++编译执行过程_编译器_04

          在这一步中可能会报错,如下:

微观的C/C++编译执行过程_可执行文件_05

           你重新生成一下 .o 目标文件,改成别的名字就好了。

           根本原因是上一步要用小写的 -c

           最后生成的 .exe 双击执行就可以看到 “Hello World” 了。