静态库和动态库
2021 年 03 月 06 日 160 543 字 暂无评论

01.什么是库

  • 库文件是计算机上的一类文件,可以简单的把库文件看成一种代码仓库,它提供给使用者一些可以直接拿来用的变量、函数或类。
  • 库是特殊的一种程序,编写库的程序和编写一般的程序区别不大,只是库不能单独运行。
  • 库文件有两种,静态库和动态库(共享库),区别是:静态库在程序的链接阶段被复制到了程序中;动态库在链接阶段没有被复制到程序中,而是程序在运行时由系统动态加载到内存中供程序调用。
  • 库的好处:

    • 代码保密。
    • 方便部署和分发。

02.静态库的制作

03.动态库的制作

04.工作原理

  • 静态库:GCC进行链接时,会把静态库中的代码打包到可执行程序中。
  • 动态库:GCC进行链接时,动态库的代码不会被打包到可执行程序中。
  • 程序启动之后,动态库会被动态加载到内存中,通过ldd(list dynamic dependencies)命令检查动态库依赖关系。
  • 如何定位共享库文件呢?

    • 当系统加载可执行代码时候,能够知道其所依赖的库的名字,但是还需要知道绝对路径。
    • 此时就需要系统的动态载入器来获取该绝对路径。
    • 对于elf格式的可执行程序,是由ld-linux.so来完成的,它先后搜索elf文件的DT_RPATH段->环境变量LD_LIBRARY_PATH->/etc/ld.so.cache文件列表->/lib/,/usr/lib目录找到库文件后将其载入内存。

05.程序编译成可执行程序的过程

06.静态库的优缺点

  • 优点:

    • 静态库被打包到应用程序中加载速度快。
    • 发布程序无需提供静态库,移植方便。
  • 缺点:

    • 消耗系统资源,浪费内存。
    • 更新、部署、发布麻烦。

07.动态库的优缺点

  • 优点:

    • 可以实现进程间资源共享(共享库)。
    • 更新、部署、发布简单。
    • 可以控制何时加载动态库。
  • 缺点:

    • 加载速度比静态库慢。
    • 发布程序时需要提供依赖的动态库。

版权属于:zfh

本文链接:http://zfhblog.com/index.php/archives/200/



评论已关闭