美文网首页
iOS 编译

iOS 编译

作者: Amor瑾年v | 来源:发表于2021-01-30 22:29 被阅读0次

原文:https://blog.csdn.net/aas319/article/details/78606342

为什么需要编译?

我们使用OC或者swift编写代码cpu无法直接识别,需要通过编译生成cpu可以识别的二进制代码。

LLVM

(Xcode就是使用LLVM进行编译,代码的高亮、实时代码检查、代码提示都是LLVM里面的clang提供的功能,debug是LLDB提供的)

LLVM相当于一个工具,可以将高级语言代码编译成CPU可以识别的机器代码。他将整个编译过程分为三个模块:前端、公用优化器、后端

前端:主要是clang负责

1.预处理:宏的替换,删除注释,展开头文件(将import引入的文件代码放入对应文件)。代码被完全拆开后会进行符号化,方便后续的语法语义分析
2.语法和语义分析:将之前符号化以后的代码转换为语法树,然后遍历分析。包括类型检查、实现检查(这里只是检查有没有某个方法,并不会检查有没有方法实现)如果发现错误会报错或者警告
3.生成中间码 :生成LLVM IR中间码

公用优化器:

将生成的中间代码进行优化,去除冗余代码,进行结构优化。

后端:

1.将中间码LLVM IR进一步转换,编程 汇编语言,再转换成机器语言
2.链接:将编译后的 不同机器代码合并成一个可执行文件

iOS项目编译的过程:

  • 写入辅助文件:将项目的文件结构对应表、将要执行的脚本、项目依赖库的文件结构对应表写成文件,方便后面使用;并且创建一个 .app 包,后面编译后的文件都会被放入包中;
  • 运行预设脚本:Cocoapods 会预设一些脚本,当然你也可以自己预设一些脚本来运行。这些脚本都在 Build Phases 中可以看到;
  • 编译文件:针对每一个文件进行编译,生成可执行文件 Mach-O,这里包含 LLVM 的完整流程,前端、优化器、后端;
  • 链接文件:将项目中的多个可执行文件合并成一个文件;
  • 拷贝资源文件:将项目中的资源文件拷贝到目标包;
  • 编译 storyboard 文件:storyboard 文件也是会被编译的;
  • 链接 storyboard 文件:将编译后的 storyboard 文件链接成一个文件;
  • 编译 Asset 文件:我们的图片如果使用 Assets.xcassets 来管理图片,那么这些图片将会被编译成机器码,除了 icon 和 launchImage;
  • 运行 Cocoapods 脚本:将在编译项目之前已经编译好的依赖库和相关资源拷贝到包中。
  • 生成 .app 包
  • 将 Swift 标准库拷贝到包中
  • 对包进行签名
  • 完成打包

静态库和 动态库的区别

静态库在编译的时候会拷贝到程序中,多次使用会多次拷贝,优点是程序没有外部依赖,直接就可以运行,劣势就是使程序的体积增大

动态库是在运行时才会加载,相同的动态库只会加载在一次。优点是不需要拷贝到程序中,不会影响程序的体积,而且同一份库可以被多个程序使用。缺点就是动态载入会损失一部分性能,使用动态库也会使程序依赖外部环境,如果环境缺少动态库或者库的版本不正确,程序就无法运行。

一般.a肯定是静态库,.dylib是动态库

.framework有静态库也有动态库,系统的.framework是动态库,自己建立的.framework是静态库

.a和.framework的区别:

.a是一个纯二进制文件,.framework中既有二进制文件也有资源文件

.a不能直接使用,还要有.h文件配合,.framework可以直接使用

相关文章

网友评论

      本文标题:iOS 编译

      本文链接:https://www.haomeiwen.com/subject/vtfltltx.html