2025年动态库和静态库的区别是什么(静态库与动态库的区别与优缺点)

动态库和静态库的区别是什么(静态库与动态库的区别与优缺点)库是写好的 成熟的 可以复用的代码 一般程序运行都需要依赖许多底层库文件 本质上来说库是一种可可执行代码的二进制形式 可以**作系统载入内存执行 库有两种 静态库 a lib 和动态库 so dll 静态 动态是指链接 将一个程序编译成可执行程序步骤如下 程序编译过程 所谓静态库 是因为在链接阶段 会将汇编生成的目标文件 o 与引用到的库一起链接打包到可执行文件中

大家好,我是讯享网,很高兴认识大家。



库是写好的,成熟的,可以复用的代码,一般程序运行都需要依赖许多底层库文件。

本质上来说库是一种可可执行代码的二进制形式,可以**作系统载入内存执行,库有两种:静态库(.a、.lib)和动态库(.so、.dll)。

静态、动态是指链接,将一个程序编译成可执行程序步骤如下:


讯享网

程序编译过程

所谓静态库,是因为在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中,对应的链接方式成为静态链接。

静态库与汇编生成的目标文件一起链接成为可执行文件,那么可以得出,静态库的格式跟.o文件格式相似,其实一个静态库可以简单看成是一组目标文件(.o/.ojb文件)的集合,即很多目标文件经过压缩打包后形成的一个文件。

  • 优点
    • 程序在运行时与函数库就没有关系,移植方便
  • 缺点
    • 浪费空间和资源,所有相关的目标文件与牵涉的函数库被链接合成一个可执行文件

Linux下静态库命名规则

必须是lib{your_library_name}.a:lib为前缀,中间是静态库名,扩展名为.a

创建静态库(.a)

下面以一个简单四则运算C++类为例,将其编译为静态库给他人用。

头文件

 
  
讯享网

实现

讯享网

Linux通过ar工具,Windows下vs使用lib.exe,将目标文件压缩到一起,并且对其进行编号和索引,以便于查找和检索。一般创建静态库的步骤如下:

创建静态库过程
  • 将代码文件编译为目标文件.o(StaticMath.o)

  • 通过ar命令将目标文件打包为.a静态文件

生成静态库libstaticmath.a

使用静态库

  • 编写测试代码
 
讯享网

为什么需要动态库?

  • 静态库会造成空间浪费,如下图:

  • 静态库对程序更新、部署和发布会带来麻烦,如果静态库更新,则所有使用它的应用程序都需要重新编译、发布给用户(一个小的改动,可能导致整个程序重新下载)。

动态库优点

  • 可以实现进程之间资源共享(因此动态库也称为共享库),如下图:

  • 使程序升级变得简单

Linux下动态库命名规则
命名形式为libxxx.so,前缀是lib,后缀名为“.so”

创建静态库(.so)

类似四则运算代码

头文件

 

实现

讯享网

与静态库不同,创建动态库不需要打包工具(ar,lib.exe),直接使用编译器即可创建动态库。

  • 生成目标文件,加编译选项-fpic

  • 生成动态库,加编译选项-shared

上面两个命令也可以合并为一个

使用静态库

  • 编写测试代码
 

由于动态库是在程序运行时进行链接,所以在程序运行时需要让系统能够找到动态库,系统一般会依次搜索:环境变量LD_LIBRARY_PATH、/etc/ld.so.cache文件列表、/lib、/usr/lib目录找到库文件后将其载入内存。因此主要有三种方法来设置动态库路径。

  • 将动态库绝对路径加入环境变量LD_LIBRARY_PATH
  • 将动态库绝对路径加入/etc/ld.so.cache文件中,步骤如下:
    • 编辑/etc/ld.so.conf文件,加入文件所在目录的路径
    • 运行ldconfig,重建/etc/ld.so.cache
  • 将动态库移到/lib或/usr/lib中
讯享网

参考资料

C++静态库与动态库


小讯
上一篇 2025-05-31 22:10
下一篇 2025-04-20 09:10

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/196220.html