问题
在swift工程里面,如果是通过pod去管理公有库,或者团队里面的私有库依赖。需要在Podfile
文件里面加入use_frameworks!
,因为不支持静态库。当然如果动态库比较多的话,会影响启动速度,不过Cocoapods
从1.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:
实战
- 通过
pod lib create LibraryName
命令创建 - 把静态库放到你开发的库里面
- 如果当前开发的库里面,除了静态库/动态库(假的)和头文件外,没有其他文件,你需要随便创建个类,否则不行
- 关于
.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