1. 编译步骤
1.1 预处理
* 宏定义展开
* 头文件展开
* 条件编译等
* 将代码中的注释删除
* 不会检查语法
1.2 编译
* 检查语法,将预处理后文件编译生成汇编文件
1.3 汇编
* 将汇编文件生成目标文件(二进制文件)
1.4 链接
* C语言写的程序是需要依赖各种库的,所以编译之后还需要把库链接到最终的可执行程序中去
2. 编译命令
* 预处理:`gcc -E hello.c -o hello.i`
* 编 译:`gcc -S hello.i -o hello.s`
* 汇 编:`gcc -c hello.s -o hello.o`
* 链 接:`gcc hello.o -o hello`
选项 | 含义 |
---|---|
-E | 只进行预处理 |
-S | 只进行预处理和编译 |
-c | 只进行预处理、编译和汇编 |
-o file | 指定生成的输出文件名为file |
文件后缀 | 含义 |
---|---|
.c | C语言文件 |
.i | 预处理后的C语言文件 |
.s | 编译后的汇编文件 |
.o | 编译后的目标文件 |
3. 简单的例子
#include <stdio.h>
#define TIMESTAMP 20221020
int main()
{
#if 0
printf("this line won't be printed\n");
#endif
// annotation won't be compiled
/* same */
#if 1
printf("this line will be printed\n");
#endif
printf("hello world %d\n", TIMESTAMP);
return 0;
}
gcc -E hello.c -o hello.i
可以看到生成的.i文件
- #会将后面的文件都copy到预处理文件中
- .I文件最后的截图
gcc -S hello.i -o hello.s
.s文件生成的是汇编文件
gcc -c hello.s -o hello.o
.o文件是二进制文件