简明易懂的动态链接库(.dll)和静态链接库(.lib)的优缺点分析
来源:互联网 发布:剑三菊花dbm数据 编辑:程序博客网 时间:2024/06/02 06:26
如果您用过DEV C++这尿性的编译器,并且开过项目,那么,除了windows应用,控制台应用之外,还有就是新建“动态链接库”和“静态链接库”,由于我这么弱只会写动态链接库,只能大概说一下我自己对于这两者优缺点的理解。
首先,得明确下,这两者都是共享代码的一种方式。共享代码就是说,一帮程序员要开发一个项目,如果每个人做的不同块中有相同的功能,那么,在最后的封装中,可以把相同代码塞到链接库里(这样就不用写n遍了,节约空间)。
实际上,这两种方式各有各的优点。
1:静态链接库的优点
(1) 代码装载速度快,执行速度略比动态链接库快。原因:你一开始就调用了整个静态链接库,so,不用一个个装载当前用的函数或者方法;
(2) 只需保证在开发者的计算机中有正确的.LIB文件,在以二进制形式发布程序时不需考虑在用户的计算机上.LIB文件是否存在及版本问题。(实际上:这是.lib非常实用的一个优点= =。也许你不信,但是当你掉进.dll地狱不可自拔的时候,你就会发现.lib的实用性了)。
2 动态链接库的优点
(1) 更加节省内存并减少页面交换。原因:仅仅调用自己需要的,不需要的就不调用,所以减少内存(减少页面交换同理);
(2) DLL文件与EXE文件独立,只要输出接口不变(即名称、参数、返回值类型和调用约定不变),更换DLL文件不会对EXE文件造成任何影响,因而极大地提高了可维护性和可扩展性;
(3) 不同编程语言编写的程序只要按照函数调用约定就可以调用同一个DLL函数(当然你必须遵守函数调用约定。这东西可以视为一种协议。);
(4)由于具有以上三种性质,所以.dll适用于大规模的软件开发,使开发过程独立、耦合度小,便于不同开发者和开发组织之间进行开发和测试(你可以理解为模块化程度高)。
两者的不足:
(1) 使用静态链接生成的可执行文件体积较大,包含相同的公共代码,造成浪费(这就是重复代码一遍遍被封装的原因);
(2) 使用动态链接库的应用程序不是自完备的,它依赖的DLL模块也要存在,如果使用载入时动态链接,程序启动时发现DLL不存在,系统将终止程序并给出错误信息。而使用运行时动态链接,系统不会终止,但由于DLL中的导出函数不可用,程序会加载失败;速度比静态链接慢。当某个模块更新后,如果新模块与旧的模块不兼容,那么那些需要该模块才能运行的软件,统统撕掉。这在早期Windows中很常见(见没见过“缺少XXX.dll,程序无法运行”??如果你的用户是个ZZ。不小心删掉了,那就GG了)。
简单来说,就是:.lib用空间换时间,.dll用时间换空间。然而,它们在实战中都是非常实用的共享代码方法。
本人水平有限,如有错误之处,欢迎大家评论指正。
谢谢大家!
- 简明易懂的动态链接库(.dll)和静态链接库(.lib)的优缺点分析
- 静态链接库(.lib)和动态链接库(.dll)的区别和使用
- 【C++ Primer】静态链接库(lib)和动态链接库(dll)的区别和使用
- 【C++ Primer】静态链接库(lib)和动态链接库(dll)的区别和使用
- 【C++ Primer】静态链接库(lib)和动态链接库(dll)的区别和使用
- 静态链接库(lib)和动态链接库(dll)的区别和使用
- 静态链接库(lib)和动态链接库(dll)的区别和使用
- 关于静态链接库(LIB)和动态链接库(DLL)的理解
- lib与dll的关系(详解静态链接库和动态链接库)
- 动态链接库(.dll、.lib)与静态链接库(.lib)的创建与使用
- 静态库lib和动态链接库dll的基础知识
- 静态链接库(LIB)和动态链接库(DLL),DLL的静态加载和动态加载,两种LIB文件。
- 静态链接库(LIB)和动态链接库(DLL),DLL的静态加载和动态加载,两种LIB文件。
- 静态链接库(LIB)和动态链接库(DLL),DLL的静态加载和动态加载,两种LIB文件。
- 静态链接库(LIB)和动态链接库(DLL),DLL的静态加载和动态加载,两种LIB文件。
- 动态链接库(DLL)和静态库(lib)
- dll、lib(动态链接库、静态链接库)的区别
- 入门知识之——VC++ 静态链接库和动态链接库的配置 (lib、dll)
- kafka常见问题汇总
- I2C总线之(一)---概述
- Understanding Git Conceptually新手理解Git (Note)
- 最长回文串模板
- 第一章 1.1 基础编程模型(我们把描述和实现算法所用到的语言特性、软件库和操作系统特性总称为基础编程模型)
- 简明易懂的动态链接库(.dll)和静态链接库(.lib)的优缺点分析
- Spring 实战学习笔记
- 一份完整的拍照后加水印代码
- Gym
- Leetcode566. Reshape the Matrix
- oracle组合索引
- Oracle与Mysql区别简述
- 图像分割“The One Hundred Layers Tiramisu: Fully Convolutional DenseNets for Semantic Segmentation”
- xlistview...