鞠古香 发表于 2025-6-7 09:08:05

Linux_动态库与静态库(其一)

1.动态库和静态库的定义
动态库(.so):动态库是编译后不嵌入目标文件中的共享库,在程序运行的时候才去链接动态库的代码,可以被多个程序共享使用,通常以 .so 结尾。
静态库(.a):静态库是将一组目标文件(.o文件)打包成一个单一的归档文件。在编译时,链接器会将所需的目标文件代码复制到最终生成的可执行文件中,程序运行的时候将不再需要静态库,通常以.a结尾。
库的命名规则:
lib+库名+后缀(.s/.so等)
eg:libc.so的库名为c,其表示c语言动态库

eg:libc.a的库名为c,其表示c语言静态库

2.动静态程序的运行过程:

静态可执行程序
加载:因为可执行程序包含头文件所有方法和main函数,所以加载到内存比较大。
在内存的程序代码通过页表对应进程地址空间的正文代码段
如果其他进程也需要使用C库,内存中没有加载C库,C库在静态可执行程序中,所以其他进程还要重新加载C库,浪费了内存空间
动态可执行程序
加载:除了代码加载到内存,其所使用的方法也会被加到内存。所以加载比较小
内存中的代码映射到进程地址空间的正文代码段,所使用的方法映射到栈和堆区之间的共享区
如果其他进程也需要使用C库,则只要调整其他进程的映射关系到已经在内存加载好的C库即可,
不需要重复加载,节省内存空间
3.查看可执行程序依赖的动态库(ldd)

ldd主要用于查看动态库的依赖关系,而静态库在编译时会被直接链接到可执行文件中,因此通常不会显示依赖。

4.静态库与动态库的优缺点
静态库
缺点:
1).加载到内存时所占空间大
2).多个进程使用同一库会导致内存资源浪费
优点:
1).与库无关,库已经链接在可执行程序中,删除库后仍可运行
2).程序不依赖于库,跨平台性更强
动态库
缺点:
1).依赖库,如果可执行程序生成后,删除库则无法运行这个可执行程序
优点:
1).节省内存空间资源
对比动态可执行程序与静态可执行程序所占内存的差异:


来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

空娅芬 发表于 2025-12-6 13:11:55

谢谢楼主提供!

怒鼓踊 发表于 2025-12-17 12:03:31

过来提前占个楼

移国拱 发表于 2025-12-20 23:54:30

用心讨论,共获提升!

鞍注塔 发表于 2025-12-24 02:42:57

懂技术并乐意极积无私分享的人越来越少。珍惜

撒阗奕 发表于 2026-1-7 12:26:56

感谢分享

胆饬 发表于 2026-1-18 00:17:52

这个好,看起来很实用

娥搽裙 发表于 2026-1-20 16:02:20

鼓励转贴优秀软件安全工具和文档!

背竽 发表于 2026-1-22 12:09:26

东西不错很实用谢谢分享

端木茵茵 发表于 2026-1-25 23:41:40

感谢发布原创作品,程序园因你更精彩

訾懵 发表于 2026-1-29 02:38:05

这个好,看起来很实用

裆趾针 发表于 2026-1-29 11:12:11

收藏一下   不知道什么时候能用到

绘纵 发表于 2026-2-1 05:52:41

过来提前占个楼

左丘雅秀 发表于 2026-2-3 03:02:05

感谢分享

圉棺 发表于 2026-2-6 07:19:45

新版吗?好像是停更了吧。

钱匾 发表于 2026-2-6 12:59:37

热心回复!

公新蕾 发表于 2026-2-9 08:18:38

新版吗?好像是停更了吧。

裴竹悦 发表于 2026-2-9 13:56:04

感谢分享,学习下。

毕余馥 发表于 2026-2-10 00:20:26

感谢,下载保存了

肿抢 发表于 2026-2-10 23:05:51

很好很强大我过来先占个楼 待编辑
页: [1] 2
查看完整版本: Linux_动态库与静态库(其一)