网站系统开发方式,简洁大气的网站首页,wordpress sozo,制作微信公众号的网站【iOS】—— 编译链接 文章目录 【iOS】—— 编译链接编译流程预处理#xff08;预编译Prepressing#xff09;编译#xff08;Compilation#xff09;汇编#xff08;Assembly#xff09;链接#xff08;Linking#xff09; 编译流程
编译流程分为四步
预处理#…【iOS】—— 编译链接 文章目录 【iOS】—— 编译链接编译流程预处理预编译Prepressing编译Compilation汇编Assembly链接Linking 编译流程
编译流程分为四步
预处理Prepressing编译Compilation汇编Assembly链接Linking 预处理预编译Prepressing
作为编译的第一步首先将main.m文件编译成了main.i文件指令如下
clang -E main.m -o main.i预处理的过程虽然是将main.m文件编译成了mian.i文件但是实际上的过程并不是这么简单的那么具体的预编译情况是什么样的呢 预编译是要处理源代码中以#开头的所有预编译指令。规则如下
#define 删除并展开对应的宏定义。处理所有的条件预编译指令。如#if、#ifdef、#else、#endif。#include #import 包含的文件递归插入到此处(含#处)。删除所有的注释 //、/**/等。添加行号和文件名标识。如 # 1 “main.m编译调试会用到。
编译Compilation
将main.i文件编译成main.s文件指令如下:
clang -S main.i -o main.s这个过程就是把上面的main.i文件进行词法分析、语法分析、静态分析优化生成相应的汇编代码最终生成main.s文件。
这里我们需要了解一下这几个名词
词法分析把源代码的字符序列分割成一个个token关键字、表示符、字面量、特殊符号比如把标识符放到符号表里面。语法分析: 生成抽象语法树AST此时运算符号的优先级确定了有些符号具有多重含义也确定了比如*是乘号还是对指针取内容表达式不合法、括号不匹配等等都会报错。静态分析分析类型声明和匹配问题。比如整型和字符串相加肯定会报错。中间语法生成: CodeGen根据AST(抽象语法树)自上向下逐步翻译成LLVM IR并且对在编译期就可以确定的表达式进行优化比如代码里面的a13可以优化成a4。假如开启了bitcode目标代码生成与优化: 根据中间语法生成依赖具体机器的汇编语言并优化汇编语言。这个过程中假如有变量且定义在同一个编译单元里那么就给这个变量分配空间确定变量的地址。假如变量或者函数不定义在这个编译单元里面那就等到链接的时候才能确定地址。
汇编Assembly
将main.s文件编译成main.o文件(也就是我们常说的目标文件)指令如下:
clang -c main.s -o main.o这个过程就是把上面得到的main.s文件里面的汇编指令翻译成机器指令最终生成等到main.o
链接Linking
这个过程就是将main.o编译成对应的Mach-O文件也就是我们常说的可执行文件指令如下
clang main.o -o main链接的本质就是把一个或多个目标文件和需要的库静态库/动态库如果需要的话组合成一个文件Mach-O可执行文件