动态库实战

1,887 阅读2分钟

问题

在swift工程里面,如果是通过pod去管理公有库,或者团队里面的私有库依赖。需要在Podfile文件里面加入use_frameworks!,因为不支持静态库。当然如果动态库比较多的话,会影响启动速度,不过Cocoapods1.5.0版本开始支持了swift静态库,详情请参考CocoaPods 1.5.0 — Swift Static Libraries

这不是本文的重点,让我们还回到本次文章的主题,。

假如我们项目里面要依赖于支付宝、微信等第三方SDK,有些第三方SDK是静态库。 假如我们是直接通过Pod 引入静态库,如果只是一级依赖,pod install/update 是可以通过,如果是有多级依赖,执行上面命令就会出现如下错误信息

[!] The 'xxxxx' target has transitive dependencies that include static binaries:

实战

  1. 通过pod lib create LibraryName 命令创建
  2. 把静态库放到你开发的库里面
  3. 如果当前开发的库里面,除了静态库/动态库(假的)和头文件外,没有其他文件,你需要随便创建个类,否则不行
  4. 关于.podspec文件的写法,可以参考:github.com/isandboy/SY…

注意

当没有使用到第三方静态库中的相关API时,链接器帮我们链接动态库的时候可能并不会把静态库吸附进来。我们手动在build Setting的other link flags加上-all_load标记

如果是通过 pod lib create 命令去创建模块,可以在.podspec 文件里面加入如下命令

spec.pod_target_xcconfig = { 'OTHER_LDFLAGS' => '-all_load' }

参考:

组件化-动态库实战

如何查看一个库是静态库还是静态库

file ***.a 
file ***.framework/***

dynamically标记的为动态库,有些库虽然也是.framework格式,但实际上是静态库,可以通过上面方式查看


lipo -info ***.a  
lipo -info ***.framework/xxx

lipo -thin armv7 xxx.a -output xxx_armv7.a
···
···
···
lipo -create xxx_armv7.a xxx_x86_64.a -output xxx_new.a