美文网首页
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