iOS静态库的架构合并与目标文件剔除

在构建iOS静态库与静态Framework的时候,为了方便,我们经常需要把用于模拟器的x86_64版本和用于真机不同架构的库合并起来,命令很简单:
lipo -create for_simulator.a for_device.a -output universal.a
在使用第三方依赖的时候,如果第三方依赖以二进制库文件的形式存在,偶尔会遇到不同的第三方依赖又引用了相同的其他依赖,导致符号重复的链接错误,解决的办法也不复杂,从某一个第三方依赖的二进制库中把重复的目标文件剔除,方法也很简单:
  1. 通过xcode的链接错误找到产生冲突的第三方依赖
  2. 选其中一个或者几个依赖,列出依赖的二进制库包含的处理器架构
    lipo -info target.a
  3. 将所有处理器架构分离出来,以armv6为例
    lipo -extract_family armv6 -output target-armv6.a target.a
  4. 将分离出来的二进制文件进一步分离成目标文件
    ar -x target-armv6.a
  5. 上一步将在当前文件夹下生成库文件包含的所有目标文件,将需要剔除的目标文件删掉,并且重新合并库文件
    libtool -static -o target.a *.o
  6. 对所有处理器架构都按3到5处理完成后,将不同处理器架构的库文件合并为一个,不再赘述
值得注意的是,当第三方依赖引用了相同的其他依赖时,有可能因为实现版本不同而产生陷阱,这种情况只能联系第三方依赖的供应商来咨询和解决了。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 仅以方便自己查阅记录前言1.静态库和动态库有什么异同?静态库:链接时完整地拷贝至可执行文件中,被多次使用就有多份冗...
    190CM阅读 4,264评论 0 4
  • 这几天公司有一个新的需求,就是要将我们开发的某些东西都抽取出来,打个比方我们开发了A项目,可以以后B项目要包含A项...
    黄鱼儿啦啦啦阅读 6,190评论 2 16
  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明AGI阅读 16,003评论 3 119
  • 静态库与动态库的区别 首先来看什么是库,库(Library)说白了就是一段编译好的二进制代码,加上头文件就可以供别...
    吃瓜群众呀阅读 12,044评论 3 42
  • 妻子与你是天地合一、阴阳互补和缺一不可的共同体。你有了妻子,切莫沾沾自喜,在你的思维理念中,千万莫把妻子当佣人。 ...
    秋子y阅读 274评论 0 1