OC是用Clang/LLVM来编译的。接下来我将用clang来展开整个过程。main.m文件源码以下:程序员
//main.m文件 #import <stdio.h> int main(int argc, const char * argv[]) { printf("hello ~"); return 0; } 复制代码
平时用Xcode去Build,一键从源码到程序。这个过程当中隐藏了预处理、编译、汇编和连接4个过程以下:bash
clang -E main.m -o main.i
复制代码
处理源代码文件中的以"#"开头的预编译指令。规则以下:markdown
clang -S main.i -o main.s
复制代码
编译就是把上面获得的.i文件进行:词法分析、语法分析、静态分析、优化生成相应的汇编代码,获得.s文件。函数
clang -c main.s -o main.o
复制代码
汇编就是把上面获得的.s文件里的汇编指令一一翻译成机器指令。获得.o文件,也就是目标文件,后面会重点讲的Mach-O文件。post
clang main.o -o main
复制代码
远古时代,一个程序只有一个源代码文件,致使程序的维护很是困难。如今程序都是分模块组成,好比一个App,对应有多个源代码文件。每一个源代码文件汇编成目标文件,根据上面流程A目标文件访问B目标文件的函数或者变量,是不知道地址的,连接就是要解决这个问题。连接过程主要包括地址和空间分配、符号决议和重定位。优化
连接就是把目标文件(一个或多个)和须要的库(静态库/动态库)连接成可执行文件。后面会分别讲静态连接和动态连接。ui
《程序员的自我修养-连接、装载与库》spa