c语言的编译步骤
代码语言:javascript复制gcc 编译 hello.c -o 生成的目标(可执行文件)名字为 world
预处理
代码语言:javascript复制gcc -E hello.c -o hello.i
带#的语句就是预处理指令,预处理指令在预处理的时候处理了
- 头文件展开:
#include <stdio.h>
包含文件stdio.h
(预处理时将stdio.h 文件拷贝至预处理文件中) - 删除注释: 注释有两种方法:
//
/* */
- 宏替换:
#define
代表是声明一个宏,在预处理时会将宏给替代
(预处理的时候就会替换) - 预处理时 不会检查语法错误
- 条件编译: 条件不成立:
#if 0 -> #endif
条件成立#if 1 -> #endif
- c语言中
0表示不成立
1表示成立
- c语言中
- 宏定义展开、头文件展开、条件编译等,同时将代码中的注释删除,这里并不会检查语法
编译
代码语言:javascript复制gcc -S hello.i -o hello.s
- 将预处理文件编译生成汇编文件 检查语法错误
- 检查语法,将预处理后文件编译生成汇编文件
汇编
代码语言:javascript复制gcc -c hello.s -o hello.o
- 汇编文件编译生成二进制文件.o
- 将汇编文件生成目标文件(二进制文件)
链接
代码语言:javascript复制gcc hello.o -o hello
- 设置运行环境,堆栈等,链接其他库
- C语言写的程序是需要依赖各种库的,所以编译之后还需要把库链接到最终的可执行程序中去
选项 | 含义 |
---|---|
-E | 只进行预处理 |
-S(大写) | 只进行预处理和编译 |
-c(小写) | 只进行预处理、编译和汇编 |
-o file | 指定生成的输出文件名为 file |
文件后缀 | 含义 |
---|---|
.c | C 语言文件 |
.i | 预处理后的 C 语言文件 |
.s | 编译后的汇编文件 |
.o | 编译后的目标文件 |
一步编译
代码语言:javascript复制gcc hello.c -o demo(还是经过:预处理、编译、汇编、链接的过程):