【2021.01.06】静态链接库、动态链接库

本文介绍了静态链接库和动态链接库的概念及其区别。静态链接库在编译时将代码整合到可执行文件中,导致文件体积大且可能重复。动态链接库则在运行时加载,可减少内存占用,但需要对应的DLL文件。创建动态链接库涉及函数导出和动态加载,调用函数时需使用函数指针。动态链接库通过序号导出可以达到隐藏功能的目的。
摘要由CSDN通过智能技术生成

什么是静态链接库

  1. 静态链接库就是你使用的.lib文件,库中的代码最后需要连接到你的可执行文件中去。
  2. 所以静态连接的可执行文件一般比较大一些,需要使用静态库时把.h与.lib文件复制到项目文件夹中。
  • 然后在代码中进行引用。格式如:
  1. #include "a.h"
  2. #pragma comment(lib,"a.lib")

静态链接库的缺点

  1. 使用静态链接库由于在编译时会把静态链接库与可执行文件打包在一起,所以生成的可执行文件较大。
  2. 包含相同的公用代码,造成浪费。

什么是动态链接库

  1. 动态链接库(Dynamic Link Library 或者 Dynamic-link Library,缩写为 DLL),是微软公司在微软Windows操作系统中,实现共享函数库概念的一种方式。
  2. 这些库函数的扩展名是 ”.dll"、".ocx"(包含ActiveX控制的库)或者 ".drv"(旧式的系统驱动程序)。

创建动态链接库

  • extern "C" _declspec(dllexport) 调用约定 返回类型 函数名(参数列表);
  • 使用.def文件:
  1. EXPORTS
  2. 函数名 @编号
  3. 函数名 @编号 NONAME

使用序号导出的好处

  1. 名字是一段程序最精华的注释,通过名字可以直接猜测函数的功能。
  2. 通过使用序号,可以达到隐藏的目的。

使用动态链接库

//定义函数指针,如:
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);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值