当前位置:网站首页>【基础】动态链接库/静态链接库的区别
【基础】动态链接库/静态链接库的区别
2022-07-26 14:58:00 【叫我东方小巴黎】
一、静态链接库与动态链接库的简介
C或C++程序从源文件到生成可执行文件需经历 4 个阶段
分别为预处理、编译、汇编和链接。
链接阶段所要完成的工作,是将同一项目中各源文件生成的目标文件和程序中用到的库文件整合为一个可执行文件。虽然库文件明确用于链接,但编译器提供了2种实现链接的方式,分别称为静态链接和动态链接。
采用静态链接方式实现链接操作,的库文件称为静态链接库;
采用动态链接方式实现链接操作,的库文件称为动态链接库。在 Linux 发行版系统中,静态链接库文件的后缀名通常用 .a 表示,动态链接库的后缀名通常用 .so 表示;
在 Windows 系统中,静态链接库文件的后缀名为 .lib,动态链接库的后缀名为 .dll。GCC 编译器生成可执行文件时,默认情况下会优先使用动态链接库实现链接操作,除非当前系统环境中没有程序文件所需要的动态链接库,GCC 编译器才会选择相应的静态链接库。如果两种都没有(或者 GCC 编译器未找到),则链接失败。
在 Linux 发行版中,静态链接库和动态链接库通常存放在 /usr/bin 或者 /bin 目录下

二、区别
1、静态链接库
- 静态链接库实现链接操作的方式很简单,即程序文件中哪里用到了库文件中的功能模块,GCC 编译器就会将该模板代码,直接复制到程序文件的适当位置,最终生成可执行文件。
- 静态库在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中。
优势:
可移植性强,可独立运行,即生成的可执行文件不再需要任何静态库文件的支持就可以独立运行。
可执行程序与库函数再无关系,放在如何环境当中都可以执行。
劣势:
代码冗余、可执行文件的体积大:如果程序文件中多次调用库中的同一功能模块,则该模块代码就会被复制多次,生成的可执行文件中会包含多段完全相同的代码,造成代码的冗余。和使用动态链接库生成的可执行文件相比,静态链接库生成的可执行文件的体积更大。
且如果所使用的静态库发生更新改变,你的程序必须重新编译。
2、动态链接库
动态链接库,又称为共享链接库。采用动态链接库实现链接操作时,程序文件中哪里需要库文件的功能模块,GCC 编译器不会直接将该功能模块的代码拷贝到文件中,而是将功能模块的位置信息记录到文件中,直接生成可执行文件。
显然,这样生成的可执行文件是无法独立运行的。采用动态链接库生成的可执行文件运行时,GCC 编译器会将对应的动态链接库一同加载在内存中,由于可执行文件中事先记录了所需功能模块的位置信息,所以在现有动态链接库的支持下,也可以成功运行。
如果静态库liba.lib更新了,所以使用它的应用程序都需要重新编译,可能是一个很小的改动,却导致整个程序重新下载,全量更新。
动态库在程序编译时并不会被连接到目标代码中,而是在程序运行时才被载入。
不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例,规避了空间浪费问题。动态库在程序运行是才被载入,也解决了静态库对程序的更新、部署和发布页会带来麻烦。用户只需要更新动态库即可,增量更新。
优势:
生成的执行文件文件体积小,因为可执行文件中记录的是功能模块的地址,真正的实现代码会在程序运行时被载入内存,即便功能模块被调用多次,使用的都是同一份实现代码(这也是将动态链接库称为共享链接库的原因)。
动态库的改变并不影响你的程序,所以动态函数库升级比较方便。
劣势:
可移植性差,无法独立运行,必须借助相应的库文件。
https://blog.csdn.net/oqqHuTu12345678/article/details/125083174
https://www.bilibili.com/read/cv15423597/
https://blog.csdn.net/breakpoints_/article/details/116166379
边栏推荐
- What is the transport layer protocol tcp/udp???
- DICOM学习资料收集
- Advanced Qt development: how to fit the window width and height when displaying (fitwidth+fitheight)
- Chapter 08_ Principles of index creation and design
- leetcode汇总
- Stacked noise reducing auto encoder (sdae)
- 下一代视觉Transformer:解锁CNN和Transformer正确结合方法
- postman 环境变量设置代码存放
- RPN:Region Proposal Networks (区域候选网络)
- 如何进行学术文献翻译?
猜你喜欢

下一代视觉Transformer:解锁CNN和Transformer正确结合方法

OSPF和MGRE实验

Which software must be used by scientific researchers to read literature?

RPN: region proposal networks

How to query foreign literature?

晋拓股份上交所上市:市值26亿 张东家族企业色彩浓厚

Siamfc: full convolution twin network for target tracking

Everything is available Cassandra: the fairy database behind Huawei tag

Chapter 08_ Principles of index creation and design
![[file upload vulnerability-06] distributed configuration file attack experiment - take upload-labs-4 as an example](/img/47/0e2a159bbbc7af8ef6263ca4ccc724.png)
[file upload vulnerability-06] distributed configuration file attack experiment - take upload-labs-4 as an example
随机推荐
Chuhuan technology is listed on Shenzhen Stock Exchange: Minsheng securities, with a market value of 2.7 billion, is a shareholder
QCF for deep packet inspection论文总结
最详细的专利申请教程,教你如何申请专利
Crystal special decoration submitted for registration: the first quarter revenue fell by 80%, and Chen Bo controlled 68.5% of the equity
Introduction to C language must brush the daily question of the collection of 100 questions (1-20)
Partial learning of PHP deserialization
数据权限就该这么设计,yyyds!
R语言ggplot2可视化:使用ggplot2可视化散点图、使用ggpubr包的theme_pubclean函数设置可视化图像不包含坐标轴线的主题(theme without axis lines)
Simulation of character function and string function
解决Typora图片显示不出来问题
What are the skills and methods of searching foreign literature
PyTorch中 torch.nn与torch.nn.functional的区别
Brief description of llcc68 broadcast wake-up
次轮Okaleido Tiger即将登录Binance NFT,引发社区热议
Within a week, I developed my own knowledge sharing platform
Okaleido tiger is about to log in to binance NFT in the second round, which has aroused heated discussion in the community
js 实现数字转金额价格千分符
About the selection of industrial control gateway IOT serial port to WiFi module and serial port to network port module
OpenGL学习日记2——着色器
How to find undergraduate dissertations of domestic universities?