关于iOS封装.a和.framework静态库的总结

本文介绍了静态库打包的基本知识点,分享了打包静态库时常见问题及解决办法。包括静态库包含其他静态库或框架时的处理、引用第三方开源库导致重复错误的解决、使用类别报错的处理,以及让静态库同时支持模拟器和真机的方法等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 先老生常谈一些基本知识点:

  • 静态库:.a和.framework  
  • 动态库:.dylib和.framework
  • .a是一个纯二进制文件,.framework中除了有二进制文件外还有资源文件
  • .a文件不能直接使用,至少要有.h文件配合,.framework文件可以直接使用
  • .a + .h + sourceFile = .framework(静态的)

相信大家都遇到过需要将现有的代码打包成静态库,供其他人调用的情况,如果你要打包的是单纯的.h和.m代码,或者包含其他图片、文本资源,这种情况比较简单,在此不做讨论。我想分享的是:

一、想要打包的静态库包含其他.a或.framework的情况,此时应该如何解决?

  1. 将要打包的B.a包含A.a的情况,如果在Link Binary With Libraries中引入A.a,那么只需要公布B.a以及想要公开的.h文件就够了,如果在Link Binary With Libraries没有引入A.a,那么需要将A.a和B.a同时公布出去,显然这增加了使用者的复杂度,不提倡,当然如果包含图片或者XIB资源,需要同时公布出去;
  2. 将要打包的B.a包含A.framework的情况,区别是同样的,是否在Link Binary With Libraries引入A.framework的可执行文件,如果引入了,那么只需要将B.a以及.h和他们所依赖的资源公布出去即可,如果不包含,还需要将A.framework公布出去,其实这种情况建议不在Link Binary With Libraries中引入,否则你需要将.framework中的资源拆出来,这在频繁打包的情况下,无疑是痛苦的;
  3. 将要打包的B.framework包含A.a的情况,区别是同样的,这种情况建议将A.a引入到Link Binary With Libraries中;
  4. 将要打包的B.framework包含A.framework的情况,区别是同样的,这种情况不建议将A.framework的可执行文件引入到Link Binary With Libraries中,同样是因为需要拆分A.framwork,增加维护难度;

二、打包的静态库引用第三方开源库,如果使用者的项目也正在使用同样的第三方库,会造成duplicate错误,该如何解决?

  1. 在自己的二方库中通过cocoapods管理第三方开源库,公布给使用者时,出具一份文档告知自己的静态库依赖哪些第三方开源库,让使用者同样通过cocoapods进行引入,这样就能保证某个开源库只用一份,就不会造成duplicate错误;
  2. 通过 CocoaPods 打包插件cocoapods-packager进行打包(可参考:https://www.jianshu.com/p/9096a2eb2804),它会将二方库中所有的类都加上前缀,这样也不会产生duplicate错误,缺点是增加了APP的体积,还有一个比较恶心的问题,就是你的静态库稍微复杂点,打包时间长并且很难成功,这点比较头疼;

三、如果自己的静态库中用到了类别,别人使用会报unrecognized selector sent to instance,该如何解决?

这是由于OC语言并不是对每一个函数或者方法建立符号表,而只是对每一个类创建了符号表,如果一个类有了分类,那么链接器就不会将核心类与分类之间的代码完成进行合并,这就导致了在最终的应用程序中的可执行文件缺失了分类中的代码,这样函数调用就失败了。需要告知使用者在 target --> Build setttings --> linking --> Other linker flags 添加 -Objc,但是当静态库中只有分类而没有类的时候,-Objc就失效了,这就需要使用-all_load或者-force_load了,但他们三者都会造成APP的体积增大。

四、打包出来的静态库只支持模拟器或真机,如何都支持呢?(此处以.a为例)

通过在终端执行lipo -create 真机路径 模拟器路径 -output 合并后路径,便可得到既支持模拟器又支持真机的静态库,扩展一下:①查看静态库支持的指令集:lipo -info xxx.a;②拆分支持不同框架的静态库:lipo -extract_family x86_64 -output xxx_x86_64.a  xxx.a;③查看拆分静态库里面包含的类实现(.o文件):ar  -x   xxx.a;④将.o文件合并成静态库:libtool -static -o xxx.a  *.o;⑤查看文件类型:file   fileName;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值