上次的学习了解并认识了gcc,这次任务主要是学会使用gcc的工作流程。
在 C 程序的编译过程中,依次要进行预处理、编译、汇编、链接四个阶段。这里通过编
译 C 文件 test.c 来展示 GCC 的工作流程。
- 预处理阶段
由于在 test.c 中使用了头文件 stdio.h,所以 GCC 在编译时首先要把头文件 stdio.h
中的内容加载到 test.c 中的首部。 - 编译阶段
编译阶段是整个编译过程中最复杂的一个阶段。这里拿自然语言的翻译过程作个对比。
比如在把“I love China”翻译成中文前,需要依次完成以下几个步骤:
1)考察这个句子中每个单词的拼写是不是正确。
2)考察整个句子的语法(比如主谓宾、定状补的结构等)是不是正确。
3)考察整个句子的语义是不是正确。
只有以上三个步骤都正常通过了,才能保证句子被正确翻译。同样,高级编程语言的编
译阶段也必须实现这三个步骤。
1) 步骤 1 称为词法分析,主要负责检查关键字、标识符等是否正确。
2) 步骤 2 称为语法分析,主要负责检查程序中语句的语法是否正确。
3) 步骤 3 称为语义分析,主要负责检查程序中语句的逻辑意义是否正确。 - 汇编阶段
汇编阶段的任务是把汇编程序翻译成 CPU 可以识别的二进制文件,该文件又称为目标
文件。 - 链接阶段
目标文件虽然已经可以被 CPU 直接识别,但是单个目标文件一般是无法运行的。原因
在于一个程序往往是由多个源文件组成的,每个源文件只对应一个目标文件。也许有人会问,
test 程序不就只有一个源文件 test.c 吗,为什么也不能直接运行呢?原因是 test.c 使用
了 stdio.h 对应的库函数,所以必须要把 test.o 文件和函数库文件链接在一起才能运行。
链接阶段的任务就是把程序中所有的目标文件和所需的库文件都链接在一起,最终生
成一个可以直接运行的文件,称为可执行文件。
通过此次学习了解了Linux下GCC的工作流程的概念,帮助自己更好的理解和使用gcc这个命令。