.a静态库与framework库,以及库的添加

Xcode 依赖的第三方库包括:

  • .a 静态库(Static Library)
  • . framework 动态库 (Dynamic Library)

并不能简单的认为 .framework 后缀的就是“动态库”,因为在 iOS/macOS 开发中,.framework 又分为“静态 framework”和“动态 framework”

  • 静态 .framework 可以理解是:.a 静态文件 + .h 公共头文件 + 资源文件 的集合,本质上与 .a 静态库是一致的
  • 动态 .framework 真正意义上的动态库,一般包括动态二进制文件、头文件和资源文件等。

对于一个 Static Library 工程,编译产物为 .a 静态二进制文件 + 公共 .h 头文件

对于一个 Framework 工程,编译的最终产物是动态库还是静态库,我们可以通过在 Build settings -> Linking ->Mach-O Type 中进行选择设置其值是 Dynamic Library 或者 Static Library

另外,对于一个 Mach-O 二进制文件,不管是 Static 还是 Dynamic ,一般都包含了几种不同的处理器结构,例如:i386、x86_64、armv7、armv7s、arm64等


Xcode在编译链接时,对于静态库和动态库的处理方式是不同的

  • 静态库:在链接时(Linking Time),Xcode 会自动筛选出静态库中不同 architecture 合并到对应处理器架构的主可执行二进制文件

    • 打包归档(Archive)时,Xcode 会自动忽略掉静态库中未用到的架构architecture,比如会移除掉 i386、x86_64 等Mac上模拟器专用的架构
  • 动态库:编译打包时,Xcode 会直接拷贝整个动态 framework 文件到最终的 .ipa 包中,只有在 App 真正启动时,才会进行动态链接。但是苹果不允许最终上传到 App Store Connect 后台的 .ipa 文件包含 i386、x86_64 等模拟器架构,会报 Invalid 错误,因此在打 Release 正式包时,一般会通过执行命令或者脚本的方式移除这些 Invalid 架构architectures。

如何在 Xcode 工程中添加静态库、动态库

  • 对于 “.a 静态库” 和 “framework静态库” 直接拖拽到工程中,并勾选 Copy if needed 选项即可,无需其他设置。

  • 添加“动态framework”的几种方式

    • 手动方式

    在Xcode工程中,选中app对应的target,然后在General->Embed Binaries 下点击加号,在弹出的窗口选择 Add Other……,然后在 Finder 中选择你要添加的“动态 framework”,并勾选 Copy if needed即可。需要注意的是,不能直接在 Finder 中把 .framework 文件拖拽到 Embed Binaries 中,否则会报错。

    存在问题:由于直接在编译链接的时候拷贝动态二进制文件,没有像链接静态库那样筛选掉没有使用到的架构architecture,一旦把包含了 i386、x86_64等模拟器架构的包上传到 App Store Connnect 后台,会报错。因此在打 Release 正式包时往往需要手动通过 lipo 命令或者编写脚本移除掉无用的模拟器架构。(除非开发工程只通过真机来调试,不准备在模拟器运行,且添加的动态库刚好又不包含模拟器架构)

    • 使用Carthage集成

    通过 Carthage 集成的第三方库,在 Cartfile 文件中添加好依赖之后,执行 carthage update 命令会帮我们生成一个个“动态 framework”,例如 AFNetworking.framework、SDWebImage.framework等,然后把他们拖拽到工程中的 General -> Linked Frameworks and Libraries ,然后再配置相关拷贝脚本和命令。

    关键操作:需要在 Xcode 工程的 Build Phases 中添加一个执行脚本,并在脚本中执行如下命令:

    /usr/local/bin/carthage copy-framework
    

    该命令的大概作用就是:在打包拷贝动态库时自动帮我们移除掉其中的 i386、x86_64

    • 使用 Cocoapods 集成

    同样的,使用 Cocoapods 集成动态库时,也会在工程中自动帮我们添加一个 Shell 脚本,在 Pods-xxx-frameworks.sh 脚本的内容,里面有个函数 strip_invalid_archs() 就是用于打包时移除无用的处理器架构。
    在这里插入图片描述
    因此,我们可以把自己开发的或者他们提供的动态 framework ,通过 Cocoapods 集成到工程中,在git库中添加相关动态的 .frameworks 文件。
    在这里插入图片描述

原文链接1
原文链接2:

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值