-
动态链接库
- dll: Dynamic-link Library
- 是一种不可执行的二进制程序文件,包含被可执行程序和其他dll调用的函数。
- windows中最重要的dll:
- Kernel32.dll:管理内存、进程、线程。
- User32.dll:执行用户界面任务,比如窗口的创建和消息的传送。
- GDI32.dll:画图和显示文本。
- dll不是唯一的扩展名,如linux下常常是.so。
- 使用:
- 需要文件1:.lib(引入库):注意不是静态库,包含该dll导出的函数和变量符号名。
- 需要文件2 : dll文件:实际的函数和数据。
- 编译链接可执行文件时,只需要链接引入库文件,代码和数据不用复制到可执行文件(可以对比静态链接)。
- 程序运行时加载所需的dll文件。
- 发布产品:可执行文件+dll
- 优点
- 多种语言编写,和使用。
- 可扩展性:产品更新时候,更新dll
- 二次开发,开发者可以调用dll中的功能,比如opencv中。
- 节省磁盘空间和内存。
- 有利于资源共享:字符串、图标、位图等资源,多个程序可以使用dll来共享这些资源。
- 适用于大规模的软件开发,使开发过程独立、耦合度小,便于不同开发者和开发组织之间进行开发和测试。
-
dll加载:
- 隐式链接:用lib引入库引入工程,链接器附加依赖项。
- 显式链接:用loadlibrary就是显示链接,
-
dll地狱(dll hell):
- 增加成员变量、修改导出类的基类、虚函数等操作都可能导致。
- 应用程序的某一个组件会被其他应用程序的不兼容组件覆盖也可导致。
-
静态链接库
- lib:static link library,后缀通常是lib,linux下的静态链接库是*.a文件,与动态链接库.so对应
- 使用:静态库是一个或者多个obj文件的打包,如果静态库有错,则说明相应的obj有错。
- 发布产品:可执行程序
-
优点:
- 代码装载执行快。
- 避免dll地狱。
-
加载方式:
- #pragma comment( lib , ”libTest.lib” );
- ide中设置
- 对比
- 静态链接库与动态链接库都是共享代码的方式。
- 采用静态链接库,lib中的指令都被直接包含在最终生成的EXE文件中了。
- 若使用DLL,该DLL不必被包含在最终的EXE文件中,EXE文件执行时可以“动态”地引用和卸载这个与EXE独立的DLL文件。