文章目录
- GCC/G++
- 编译
- gcc是如何完成的
- 预处理
- 编译
- 汇编
- 链接
- 编译流程
GCC/G++
编译
-
C语言源文件可以使用gcc和g++编译(优先选择gcc)
gcc test.c -o mybin
/gcc -o mybin test.c
基于test.c文件生成可执行程序mybing++ tes.c -o mybin
/g++ -o mybin test.c
基于test.c文件生成可执行程序mybin
-
C++源文件只能使用g++进行编译
g++ code.cpp -o mybin
/g++ -o mybin code.cpp
基于code.cpp文件生成可执行文件mybin
gcc是如何完成的
预处理
预处理的主要作用是进行宏替换
- 预处理功能主要包括头文件展开、宏定义、条件包含、条件编译、去除注释等
- 预处理的指令是以
#
开头的代码行
头文件展开
头文件展开是指,在预处理的时候,将头文件里面的内容拷贝到源文件中。
条件编译
通过给编译一起传递不同的宏值,来进行对代码的动态裁剪。
编译
编译的主要作用是生成汇编文件
- 在这个阶段中,gcc首先检查代码的规范性、是否存在语法错误等,以确定代码的实际要做的工作,在检查无误之后,gcc把代码翻译为汇编语言
汇编
生成机器可识别代码
- 汇编阶段是把编译阶段生成的
.s
文件转成目标文件
链接
生成可执行文件或者库文件
将代码与库文件进行链接形成可执行文件
编译流程
预处理 -> 编译 -> 汇编 -> 链接
- 预处理
gcc -E code.c -o code.i
- 执行指令,从现在开始进行程序的翻译过程,当预处理完成之后停下来,预处理之后生成的信息存入到临时文件code.i文件中
- 选项
-E
,这个选项的作用是让gcc在预处理结束后停止编译过程 - 选项
-o
,是指目标文件 .i
文件为已经经过预处理的c原始程序
- 编译
gcc -S code.i -o code.s
- 执行指令,从现在开始进行程序的翻译过程,当编译工作完成之后停下来,生成的信息写入到临时文件code.s中
- 选项
-S
,该选项只进行编译但不进行汇编,生成汇编代码
- 汇编
gcc -c code.s -o code.o
- 执行指令,从现在开始进行程序的翻译过程,当汇编工作完成之后停下来,生成的信息写入到临时文件code.o中
- 选项
-c
,可以看到已经转换为.o
的二进制目标代码
- 链接
gcc -o mybin code.o
执行指令,生成可执行文件mybin