一、概述
一段源代码到可执行性程序需要经历预处理、编译汇编和链接等步骤,接下来详细介绍这些过程
二、过程
假设文件main.czhong有如下代码:
# include <stdio.h>
int main()
{
printf("hello world!");
return 0;
}
1、预处理(生成 .i 文件)
- 操作命令:gcc -E main.c -o main.i
- 具体内容:
(1)宏定义指令
(2)条件编译
(3)头文件包含指令
(4)特殊符号处理
- 常见问题:
不能在头文件中定义全局变量,因为在头文件中定义全局变量将会使所有包含该头文件的文件存在该段代码,也就是说这些文件将定义一个相同的全局变量,这样将不可避免的造成冲突
2、编译环节(生成 .s 文件,即汇编文件)
- 操作命令:gcc -S main.i -o main.s
- 具体内容:编译环节是指对源代码进行语法分析,并优化产生对应的汇编代码的过程
(1)预编译:通过词法分析和语法分析,将其翻译成等价的中间代码或汇编代码。
(2)优化:局部优化、控制流分析和循环优化、数据流的分析和全局优化。
3、汇编过程(生成 .o 文件)
- 操作命令:gcc -c main.s -o main.o
- 具体内容:将汇编语言翻译成机器语言代码
4、链接过程(生成可执行程序)
- 操作命令:gcc -o main main.s
- 具体内容:将有关的目标文件彼此链接,也即将在一个文件中引用的符号同该符号在另外一个文件中的定义链接起来,是的所有的这些文件成为一个能够让操作系统装入执行的统一整体,可分为动态链接和静态链接
三、简便操作
在gcc中有另外一种简单的操作只需一步就可完成以上的过程,如下:
命令:gcc -o main main.c
即:gcc -o 目标代码名 源代码名