过程
预处理
处理代码中存在的所有预处理程序指令。这些指令以#开头
首先从代码中删除了所有注释(出于人类可读性)
找到所有的#命令,并执行命令所说的内容
编译
编译器从预处理器获取输出,并负责执行以下重要任务。
-
将输出传递给词法分析器,以识别文件中存在的各种标记。令牌只是程序中存在的文字,例如“ int”,“ return”,“ void”,“ 0”等。词法分析器还将令牌的类型与每个令牌相关联,无论令牌是字符串文字,整数,浮点数,if令牌等。
-
将词法分析器的输出传递到语法分析器,以检查程序是否以满足程序所用语言的语法规则的方式编写。例如,在分析此行代码时,它将引发语法错误,
-
将语法分析器的输出传递给语义分析器,该语义分析器将检查程序是否满足语言的语义,例如类型检查和变量在首次使用之前就已声明,等等。
-
如果程序在语法上是正确的,则源代码将转换为指定目标体系结构的汇编指令。默认情况下,它会为其运行的计算机生成程序集。但是假设您正在为嵌入式系统构建程序,那么您可以传递目标计算机的体系结构,gcc将为该计算机生成程序集。
汇编
将程序集文件转换为目标文件(二进制文件)
得到 .o文件
链接
每个源代码文件都不会孤立地编写。它们必须具有某些函数,这些全局变量必须在某个文件中定义,并在其他文件的不同位置使用。
链接器的工作是收集所有目标文件,遍历每个目标文件并跟踪每个文件定义的符号以及使用的符号。它可以在每个目标文件的符号表中找到所有这些信息。收集了所有这些信息之后,链接器将创建一个目标文件,将每个目标文件中的所有部分组合到相应的部分中,并重新放置所有可以解析的符号。