一、概念
静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib中的指令都全部被直接包含在最终生成的exe文件中。但是若使用动态链接库dll,该dll不必被包含在最终的exe文件中,exe文件执行时可以动态地引用和卸载这个与exe独立的dll文件,静态链接库和动态链接库的另一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。
二、区别
静态链接库
首先,对于静态链接库,它的使用需要库的开发者提供生成库的.h头文件和.lib文件。
生成库的.h头文件中的声明格式如下
extern "C" 函数返回类型 函数名(参数表);
在调用程序的.cpp源代码文件中如下:
#include "..\lib.h"
#pragma comment(lib,"..\\debug\\libTest.lib")
//指定与静态库一起链接
其次,由于静态链接库是将全部指令都包含入调用程序生成的exe文件中。因此,如果使用的是静态链接库,那么就不存在“导出某个函数提供给用户使用”的情况。
动态链接库
动态链接库的使用,根据不同的调用方法,需要提供不同的资源
(1)静态加载----程序静态编译的时候就静态导入dll,这样的话就需要提供给库使用者如下文件:*.lib文件,.dll文件和*.h。
其两个弊端:
a.程序一开始运行就需要载入整个dll,无法载入程序就不能开始运行。
b.由于载入的是整个dll,需要耗费的资源较多
其调用方法为;
#include "..\lib.h"
#pragma comment(lib,"..\\debug\\lib Test.lib")
(2)动态加载----只需要提供dll文件
调用程序若想调用DLL中的某个函数,就要以某种形式或方式知名它到底想要调用哪个函数。
生成库的.h头文件中的声明格式如下:
extern "C" 函数返回类型 __declspec(dllexport) 函数名(参数表);
在调用程序的.cpp源代码文件中按如下流程调用:
在main函数代码的开始处
定义需要的DLL模块的句柄和此DLL模块模块中需要调用的函数的函数指针。
定义好后紧接着就是标准的三部曲:
取得需要的DLL模块------>返回模块句柄
LoadLibrary("DLL模块路径")
取得需要的函数地址———>返回函数指针GetProcAddress(模块句柄,"函数名")
从内存中卸载DLL模块———>FreeLibrary(模块句柄)
本文参考自https://wenku.baidu.com/view/08034445b307e87101f69626.html