在执行pod init之后, podfile中就会自动生成 use_frameworks! 配置。use_frameworks 一共有4种配置方式:
不同的配置方式有不同的效果,先放结论
配置方式 |
链接类型 |
文件形式 |
Swift 支持 |
启动速度 |
动态加载支持 |
|
静态 |
静态框架( |
✅ |
⚡️ 快 |
❌ |
|
动态 |
动态框架( |
✅ |
慢 |
✅ |
|
动态 |
动态框架( |
✅ |
慢 |
✅ |
不使用 |
静态 |
静态库( |
❌ |
⚡️ 快 |
❌ |
use_frameworks! :linkage => :static
.dylib
)。.framework
,但内部是静态库(.a
)。use_frameworks! :linkage => :dynamic
.framework
(含 .dylib
)形式存在。use_frameworks!
(默认动态链接):linkage => :dynamic
)。use_frameworks! :linkage => :dynamic
一致。use_frameworks!
。但是可以选择 dynamic 或者
Staticuse_frameworks!
.a
文件)。.a
文件形式嵌入。podspec static_framework 的优先级大于 Podfile中的use_framework! :linkage的优先级。
也就是说以podspec中的为准。Podfile 只是改变,在podspec中没有用static_framework指定的为true或false情况下的集成方式。
如果podspec中源代码的pod库s.static_framework = true,则Podfile中用 use_frameworks! :linkage => :dynamic 也不会改变动态库的方式。
如果在podspec中既有 静态库,又有动态库:
s.dependency
'xxx'
//是一个动态库
s.dependency
'Bugly'
//是静态库
那么在Podfile中:
1、不使用:use_frameworks!
或者使用:
use_frameworks! :linkage => :static
按照静态库进行编译,则可以编译通过.
2、使用:use_frameworks!
或者
使用 use_frameworks! :linkage => :dynamic
进行动态库进行编译时,就会pod install报错:
所谓的库就是一段编译好的二进制文件+头文件+相关的资源文件,然后提供给别人使用。
静态库(.a):在编译时会将库copy一份到目标程序中进行合并,编译完成之后,目标程序不依赖外部的库进行运行,缺点是会使应用程序变大
动态库(.dylib):编译时只存储了指向动态库的引用。可以多个程序指向这个库,在运行时才加载然后动态链接,优点不会使体积变大。
Framework:实际上是一种打包方式,打出来的包可以是动态库也可以是静态库。它是将库的二进制文件,头文件和有关的资源文件打包到一起,方便管理和分发。
参考文章:
Podfile 中 use_frameworks! 的作用
https://www.jianshu.com/p/8059330a61cd
https://juejin.cn/post/6974224632983322655