在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 ) |
通过理解这些区别,可以根据项目需求合理选择库的类型。