一、概括
- 静态库:编译时嵌入目标程序,与程序融为一体,无独立文件;
- 动态库:运行时加载,独立文件,可被多个程序共享,不嵌入目标程序。
二、详细对比
| 对比维度 | 静态库(.a/.framework) | 动态库(.dylib/.framework) |
|---|---|---|
| 链接时机 | 编译 / 链接期(静态绑定) | 运行时(动态绑定,dyld 加载) |
| 代码存在形式 | 完整复制到目标程序(主程序 / 动态库) | 独立文件,目标程序仅存引用地址 |
| 安装包体积 | 增大(含库代码) | 不变(仅含引用,库单独打包) |
| 更新维护 | 需重新编译目标程序 | 可单独更新(替换动态库文件) |
| 共享性 | 不可跨程序共享(多程序各存一份) | 可跨程序共享(系统库 / 自定义库均支持) |
| 依赖关系 | 无额外依赖(代码已嵌入) | 运行时需确保库存在,否则崩溃 |
| 符号冲突风险 | 高(重复引用易触发 Duplicate Symbol) | 低(独立命名空间,符号隔离) |
| 重复引用影响 | 代码冗余 + 符号冲突(跨主程序 / 动态库引用) | 无冗余(仅加载一次,多引用共享) |
| 平台限制(iOS) | 无签名要求,越狱 / 非越狱均支持 | 需签名,非越狱需开发 / 企业证书,上架需符合规则 |
| 调试难度 | 低(代码嵌入,断点直接命中) | 高(需确保库符号文件完整,加载路径正确) |
| 内存占用 | 启动时加载,内存占用较高 | 按需加载 + 共享,内存占用较低 |
| 适用场景 | 轻量工具库、无频繁更新、需避免依赖冲突 | 核心功能库、需单独更新、多程序共享、大型库 |
三、总结
- 静态库核心:"一次嵌入,终身绑定",简单无依赖但冗余 + 难更新;
- 动态库核心:"独立存在,按需加载",省内存 + 易更新但需处理依赖 + 签名;
- 选择原则:小体积、少更新用静态库;大体积、需更新、多共享用动态库。