gcc编译流程主要分为四个步骤:预处理、编译、汇编、链接。
1、预处理
处理源文件中以“#”开头的语句。如头文件、宏定义等语句进行处理,.c文件生成.i文件。
1)宏定义的目的为了提高代码的可读性,此时对宏定义进行原样替换。
2)在头文件中主要包含函数的声明、结构体的声明等。声明的目的是为了告诉编译器做语法检查,防
止调用时出现错误。此时在预处理的作用是把头文件中的包含的内容到引用该头文件的源文件中,并没有做
语法检查。
gcc -E hello.c -o hello.i
-E:只进行预处理,预处理结束后停止编译过程。
-o:将结果输出到目标文件
2、编译
编译主要是编译器的工作,检查代码的语法结构,是否有语法错误,生成.s的汇编文件。
gcc -S hello.i -o hello.s
-S:生成.s的汇编文件,编译结束后停止编译流程。
3、汇编
将汇编代码生成计算机系统可以识别的机器码,即二进制文件,即.o文件。此时的.o文件是一个普通的二进制文
件,只不过缺少程序运行时需要的某些库,所以无法运行。
gcc -c hello.s -o hello.o
-c:生成二进制文件,汇编工作完成后停止编译。
4、链接
将二进制文件与所依赖的库文件进行链接,生成一个可执行文件。可以通过“-l”选项来进行链接。
一般c程序在调用标准库<stdio.h>时会进行默认链接,不需要开发者手动链接。但是并不是系统默认为我们
链接所有的库,例如在程序中调用了《数学库》中的库函数(例:sqrt函数)时,我们需要手动的去链接数学
库<math.h>
gcc hello.c -o hello -lm (math : 数学)