最近在对项目代码进行SDK抽离,又接触了很多新的知识,在这里记录下。
Xcode和编译过程的对应关系
OC的编译过程跟C是一致的。
中文 | 预编译 | 编译 | 汇编 | 链接 |
---|---|---|---|---|
英文 | Preprocess | Compile | Assembling | Link |
作用 | 处理文字 | 变汇编 | 转换成机器码 | 变可执行程序 |
编译是将人能读懂的Source Code变成机器能理解的汇编语言(寄存器指令),然后通过汇编变成目标机器的(Machine Code/Object Code),然后通过Link变为可执行程序的01010101….
Xcode头文件(预编译)
对于计算机来讲,头文件是不需要的
对于Xcode来说仅仅在 预编译
和 编译
阶段需要头文件来进行静态检查是否存在有不知道的类或者方法
头文件的搜索目录可以通过配置Build Setting里的 Header Search Paths 来获取头文件,这个是磁盘目录,可以是电脑上的任意目录,无需添加任何文件进入Target

Xcode Symbols(编译,汇编)
把每一个文件中的可执行代码进行 编译和汇编
可以得到 同名的.o文件
, 其后缀o就是指的 Object Code
之所以称为Object,是因为不同的硬件有不同的架构,如x86和arm64,例如iPhone模拟器是x86而iPhone真机大部分都是arm的,也就是说在此时Xcode已经完成了架构的处理
Xcode Link(链接)
最终Xcode经过链接过程将.o文件组合起来,得到一个Mach-O文件(相当于一个压缩包) 并且生成 符号表
这个过程中存在两个常见的错误提示Undefined symbols
和 Duplicated symbols
将在后续讲解
Mach-O文件是Macintosh系统中的一个文件类型,用来描述程序的运行和二进制代码之间的关系
Mach-O 文件
根据Wiki描述Mach-O为Mach Object文件格式的缩写,其由卡耐基梅隆大学和Apple开发和维护
Mach-O格式 | 说明 |
---|---|
Executable | 可执行程序,可运行的App最终会变成这个 |
Bundle | 不可以被Link的动态库,运行时可以通过NSBundle基于dlopen方法加载 |
StaticLibrary | 静态链接,Xcode默认情况下.a库会使用 |
DynamicLibrary | 动态链接,Xcode默认情况下.framework会使用 |
RelocatableObjectFile | 是编译过程中的中间产物,就是.o文件 |
Mach-O文件的结构
Mach-O区域 | 权限 | 作用 |
---|---|---|
TEXT | r-x读和执行 | 保存mach-o的文件头可执行的code以及constant常量 |
DATA | rw-读写 | 保存用于程序的全局和静态变量 |
LINKEDIT | r–只读 | 保存该库meta data,用来表示怎么加载 |
网友评论