静态链接 vs 动态链接
-
静态链接(Static Linking)
定义:
在编译时将库代码直接复制到最终的可执行文件中
特点:
生成的可执行文件包含所有需要的库代码
程序运行时不再依赖外部的库文件
可执行文件体积较大
-
动态链接(Dynamic Linking)
定义:
在程序运行时才加载所需的库
特点:
可执行文件只包含对库的引用,不包含库代码本身
程序运行时需要相应的库文件存在
可执行文件体积较小
多个程序可以共享同一个库的实例
静态库 vs 动态库
-
静态库(Static Library)
文件扩展名:
Unix-like系统:.a (Archive)
Windows系统:.lib
创建方式:
Unix-like:ar rcs libxxx.a obj1.o obj2.o
Windows:使用lib.exe工具
使用方式:
在链接阶段被完全整合到可执行文件中
优点:
程序部署简单,不需要额外的库文件
执行速度快(无运行时加载开销)
版本兼容性问题少
缺点:
可执行文件体积大
库更新需要重新编译整个程序
多个程序无法共享库代码(内存浪费)
-
动态库(Dynamic Library)
文件扩展名:
Unix-like系统:.so (Shared Object)
Windows系统:.dll (Dynamic Link Library)
macOS:.dylib
创建方式:
Unix-like:gcc -shared -o libxxx.so obj1.o obj2.o
Windows:cl /LD xxx.cpp
使用方式:
编译时链接(程序知道需要哪些符号)
运行时加载(实际代码在运行时才载入内存)
优点:
可执行文件体积小
库更新不需要重新编译主程序
多个程序可以共享同一个库实例(节省内存)
支持插件式架构
缺点:
部署复杂(需要确保目标系统有正确版本的库)
存在DLL Hell问题(版本冲突)
轻微的性能开销(运行时加载)
技术细节对比
| 特性 | 静态链接/静态库 | 动态链接/动态库 |
|---|---|---|
| 文件大小 | 较大 | 较小 |
| 内存使用 | 每个程序独立占用 | 多个程序可共享 |
| 部署复杂度 | 简单(单文件) | 复杂(需附带库文件) |
| 更新方式 | 需重新编译 | 可单独更新库 |
| 加载时机 | 编译时 | 运行时 |
| 执行速度 | 略快(无加载开销) | 略慢(有加载开销) |
| 版本兼容性 | 无问题 | 可能有问题 |
| 适用场景 | 小型工具、嵌入式系统 | 大型应用、系统组件 |