什么是静态链接库
- 静态链接库就是你使用的.lib文件,库中的代码最后需要连接到你的可执行文件中去。
- 所以静态连接的可执行文件一般比较大一些,需要使用静态库时把.h与.lib文件复制到项目文件夹中。
- 然后在代码中进行引用。格式如:
- #include "a.h"
- #pragma comment(lib,"a.lib")
静态链接库的缺点
- 使用静态链接库由于在编译时会把静态链接库与可执行文件打包在一起,所以生成的可执行文件较大。
- 包含相同的公用代码,造成浪费。
什么是动态链接库
- 动态链接库(Dynamic Link Library 或者 Dynamic-link Library,缩写为 DLL),是微软公司在微软Windows操作系统中,实现共享函数库概念的一种方式。
- 这些库函数的扩展名是 ”.dll"、".ocx"(包含ActiveX控制的库)或者 ".drv"(旧式的系统驱动程序)。
创建动态链接库
- extern "C" _declspec(dllexport) 调用约定 返回类型 函数名(参数列表);
- 使用.def文件:
- EXPORTS
- 函数名 @编号
- 函数名 @编号 NONAME
使用序号导出的好处
- 名字是一段程序最精华的注释,通过名字可以直接猜测函数的功能。
- 通过使用序号,可以达到隐藏的目的。
使用动态链接库
//定义函数指针,如:
typedef int (__stdcall *lpPlus)(int,int);
typedef int (__stdcall *lpSub)(int,int);
//声明函数指针变量,如:
lpPlus myPlus;
lpSub mySub;
//动态加载dll到内存中,如:
HINSTANCE hModule = LoadLibrary("DllDemo.dll");
//获取函数地址,如:
myPlus = (lpPlus)GetProcAddress(hModule, "Plus"); //有名字有序号的函数
mySub = (lpPlus)GetProcAddress(hModule, (char*)0x10); //没有名字只有序号的函数, 写序号即可
//调用函数,如:
int a = myPlus(10, 2);
int b = mySub(10, 2);
//释放动态链接库,如:
FreeLibrary(hModule);