iOS静态库打包动态framework踩坑集

背景

项目中最开始为了使用@import特性,在Podfile中使用的是use_frameworks!,把所有Pods做成动态framework,同时也为后面的Swift混编做好准备。
微信等第三方SDK以静态库.a的形式提供给用户,导致我们没有办法在Pods中直接依赖,会报类似xxx has transitive dependencies that include static binaries的错误,因此需要把.a封装成动态framework.于是开始了先忙的艰辛之旅。

重要概念

  • 静态库:一堆目标文件的打包体。链接时会被完整的复制到可执行文件中,存在多个可执行文件中包含同一份静态库代码的问题。
  • 动态库:一个没有main函数的可执行文件。链接时不复制代码,程序启动后用dyld加载,然后再决议符号。所以一份动态库可以供多个程序动态链接,达到节省内存的目的。

入坑

framework的制作过程网上有很多文章,我主要参考了组件化-动态库实战。再次感谢作者@南栀倾寒
按这篇文章一步一步来基本可以完成85%的工作。
制作是需要特别关注以下几点:

  • Mach-O Type要选择Dynamic Library
  • Buld Setting中Other Linker Flags要加上-all_load
  • Buld Setting中Build Active Architecture Only选No
  • 架构合并,作者在文中附带了script,很赞!
    framwork做好后可以使用lipo -info 查看所支持的CPU架构,显示出Architectures in the fat file: XXX are: i386 x86_64 armv7 arm64表示同时支持了模拟器和真机,可以拿来用了。

恼人的秋风--bitcode问题

framework打好了,调试运行一切OK,打包上线走起,果然挂了!!!error提示

bitcode bundle could not be generated because
 xxx was built without full bitcode.
All object files and libraries for bitcode must be generated from Xcode Archive or Install build for architecture armv7 

又是一番Google。最终在这篇文章找到了解决方案,泪流满面。同时脑补了下-fembed-bitcode-marker和-fembed-bitcode,还是蛮开心。于是在Bulid Settings中同时做了以下处理

  1. Enable Bitcode = Yes
  2. Other C Flags中添加-fembed-bitcode
  3. User-Defined中添加BITCODE_GENERATION_MODE=bitcode

然后再次构建出新的framework,终于,稳了。

你可能感兴趣的:(iOS静态库打包动态framework踩坑集)