动态链接库
什么是库
构建一个应用程序,我们不会从驱动底层一直写到前端,库的存在正好填充这一点,可以避免重复造*。库是可复用的,稳定的功能集合。
Windows API中三个最重要的库:Kernel32.dll、User32.dll、GDI32.dll;各类语言也封装了自己的库:C/C++运行库,C#的FCL等。
库的分类
库分为静态链接库(.a、.lib)和动态链接库(.so、.dll、.exe),静态和动态是指链接的动作和时机。静态链接就是把静态库中的函数代码直接链接进目标程序,链接在应用程序编译时完成,程序运行时不需要该库文件。动态链接就是把被调函数所在动态库和被调函数在库文件中的位置等信息链接进目标程序,程序在运行过程中再从动态库中寻找相应函数,链接在应用程序运行时完成。
无论是动态库还是静态库,都具备代码重用性并促进了应用程序的模块化,那为什么还需要动态库?
动态库的优势:
(1)具备动态扩展应用程序的能力
应用程序可以显示载入动态链接库(上述的表述都是隐式载入动态链接库),并执行一些操作,扩展应用程序的功能。例如,一家A公司开发了一个产品,产品发展到一个阶段 ,需要提供远程联网和监控的功能,这时他想让另一个团队或公司对产品进行扩展,这时候DLL就非常有用了。
(2)有助于节省内存空间
如果一个静态库被100个应用程序复用,100应用程序同时打开,相当于该静态库在内存中拷贝了100次。但动态库只会在内存中加载一次。
(3)便于应用程序更新、部署和发布
一个大型应用程序引用了一个静态库,如果静态库修改,那整个应用程序都得重新编译和发布,对于玩家来说就是重新安装软件。而引用动态库的应用程序,只需修改动态 库,对于玩家来说只是简单的升级。
(4)促进了本地化
DLL常常用来对应用程序进行本地化。例如,一个应用程序可以只包含代码(语言文化中性)但不包含用户界面等语言文化差异组件和资源,DLL用来存放这些受语言文化差异影响的内容,供应用程序载入并使用。
动态库劣势:
(1)移植
引用动态库的应用程序不如引用静态库的应用程序移植方便
(2)初始化
引用动态库的应用程序初始化时间较长
如何构建动态库
以 VS2013 构建C++动态库为例
1.新建项目MyDLL,在向导中选择DLL和导出符号(用来自动生成导出内容的基础文件)
2.MyDLL.h头文件是为了导出DLL中的函数、变量和类自动生成的文件
3.编译上述项目生成如下文件
如何使用动态链接库
需要动态库的三个文件:MyDLL.h、MyDLL.lib、MyDLL.dll,使用时需要部署这三个文件
1.新建控制台应用程序MyAPP
2.右击项目“属性“
(1)部署.h文件,选择MyDLL.h文件所在目录
(2)部署.lib文件
选择.lib文件所在目录
填写附加库名称 MyAPP.lib
(3)部署.dll文件
将MyDLL.dll文件拷贝到MyAPP项目的输出目录即可。
3.在需要使用MyDLL.dll中导出的函数、变量及类型的源文件中添加#include "MyDLL.h"即可使用这些导出内容。
PS:如对动态库的导入导出原理及相关编译过程感兴趣,请参考后续文章。
上一篇: 请问一个http协议抓包分析