Linux 中动态链接库和静态链接库的区别与联系

 

 

Linux 中动态链接库和静态链接库的区别与联系

  

001、名称差异

静态库:.a

动态库:.so

 

 

002、核心区别:

一、基本定义(一句话版)

✅ 静态链接库(Static Library)

  • 在链接阶段完整拷贝进可执行文件

  • 常见文件名:libxxx.a

✅ 动态链接库(Shared / Dynamic Library)

  • 不拷贝进程序,运行时再加载

  • 多个程序可以共享同一份库

  • 常见文件名:libxxx.so

 

003、核心差异

image

 

 

因此静态库更稳定,但是更消耗资源;

动态库更加高效,共享,但是不稳定(动态库升级,程序无法运行)。

 

004、 为什么静态库的后缀是.a, 而动态库的后缀是.so;

.a 来源于归档 archive;

.so 来源于shared object(共享目标文件)

 

005、 静态库和动态库的存放目录(通常见下面四个目录

/lib

/lib64

/usr/lib

/usr/lib64

 

006、/lib64 和 /usr/lib64 目录下的库文件有什么区别

/lib64 放的是“系统启动和最基本运行所必需的库”,
/usr/lib64 放的是“系统正常运行后,大多数程序使用的库”

 

  • 在早期阶段:

    • /usr 可能还没挂载

    • 但系统已经要运行程序了

👉 所以:

  • 必须能在没有 /usr 的情况下运行的库

  • 放在 /lib64

 

为什么不全放在 /lib64 ?
 

因为 /lib64 的目标是“让系统活下来”,而不是“让系统好用”;
如果所有库都放进 /lib64,系统将变得臃肿、难维护、不可扩展。

 

 

007、如何使用命令确定库文件到底是静态库还是动态库

[root@PC1 lib64]# pwd
/usr/lib64
[root@PC1 lib64]# file libsmime3.so            ## 使用file命令
libsmime3.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=55c11ab164d965c94cd4dddfdeffaf5f02b8aeb5, stripped
[root@PC1 lib64]# find *.a | head
libanl.a
libc_nonshared.a
libdl.a
libg.a
libmcheck.a
libpthread.a
librt.a
libutil.a
[root@PC1 lib64]# file libanl.a
libanl.a: current ar archive            ## archive 静态库

image

 。

 

008、 动态库.so后边的数字是什么意思

image

 

.so 后的数字不是“装饰”,而是 Linux 动态链接体系中
用来区分 ABI 兼容性的核心机制(SONAME)。

 

posted @ 2025-12-15 09:33  小鲨鱼2018  阅读(11)  评论(0)    收藏  举报