在Linux系统中,静态链接库(.a文件)和动态链接库(.so文件)是两种不同的库链接方式,它们在编译、链接、运行时行为等方面有显著区别。以下是详细对比:
静态库(.a)
.o目标文件通过ar工具打包生成。gcc -c libfoo.c -o libfoo.o
ar rcs libfoo.a libfoo.o
动态库(.so)
-shared选项生成。gcc -shared -fPIC libfoo.c -o libfoo.so
静态库
gcc main.c -L. -lfoo -o main_static
动态库
libfoo.so),实际加载由动态链接器(ld.so)在程序启动时完成。gcc main.c -L. -lfoo -o main_shared
静态库
动态库
LD_LIBRARY_PATH或系统路径)。静态库
动态库
静态库
nm或objdump查看符号:nm libfoo.a
动态库
ldd检查运行时依赖:ldd main_shared
readelf查看动态段:readelf -d libfoo.so
静态库适用场景
动态库适用场景
glibc、libssl)。| 特性 | 静态库 | 动态库 |
|---|---|---|
| 文件体积 | 较大(含库代码) | 较小(仅引用) |
| 运行时依赖 | 无 | 需确保库存在 |
| 更新维护 | 需重新编译程序 | 替换.so文件即可(ABI兼容时) |
| 内存占用 | 每个进程独立占用 | 多进程共享 |
| 兼容性风险 | 无 | 需处理版本冲突(如soname) |
通过理解这些区别,可以根据项目需求合理选择库的类型。