VS2019静态库与动态库入门操作指南

本文详细介绍了静态库与动态库的区别、封装方法及调用方式,包括库的创建、头文件的导出、库文件的生成以及如何在其他项目中调用这些库。

一、库的概念

源代码的二进制文件;

二、编译

分为动态编译与静态编译;

1)区别

(1)动态编译不便于发布,静态编译便于发布;

(2)动态编译生成的可执行文件体积较小,静态生成的可执行文件体积较大。

​ Windows中静态库后缀为.lib 动态库后缀为.dll

​ Linux中静态库后缀为.a 动态库后缀为.so

​ 使用静态库后得到的可执行程序在执行时对这个库不再依赖。

​ 使用动态库,便于升级与更新,接口保持不变,就可以通过更新DLL来升级程序,而不用重新 编译程序;

​ 在不同的程序调用相同的库,则在内存里只需要有一份该共享库的实例;

三、静态库的封装与调用

1)使用VS创建静态库项目

在这里插入图片描述
在这里插入图片描述

2)创建头文件并导出需要的函数或类

(1)创建.h头文件(名称自定);
(2)导出方式确定,以C或C++方式;
(3)选中导出的函数名或类名 快捷键Alt + Enter ,在对应的同名源文件中创建对应函数或类的定义;

在这里插入图片描述

3)生成静态库文件

在这里插入图片描述

4)新建空项目

(1)将生成的name.lib与name.dll文件复制进新建空项目中;

(2)属性管理器中选择对应解决方案与平台,右击添加附加依赖项;
在这里插入图片描述
在这里插入图片描述
输入依赖库的名称
在这里插入图片描述
(2)在空项目中创建测试

使用program comment(lib,“name.lib”) 加载静态库

extern “C” _declspec(dllimport) 类型 函数名(); 导入C类型静态库

或 _declspec(dllimport) 类型 函数名();导入C++类型静态库

(3)编写函数或类,调用测试
在这里插入图片描述
(4)选择解决方案配置与平台,选择调试
在这里插入图片描述

四、动态库的封装(C/C++函数导出)

1)使用VS创建动态库项目

在这里插入图片描述
在这里插入图片描述

2)创建头文件并导出需要的函数或类

(1)创建.h头文件(名称自定);
(2)导出方式确定,以C或C++方式;
(3)选中导出的函数名或类名 Alt + Enter ,在对应的同名源文件中创建对应函数的定义;
在这里插入图片描述

3)生成动态库文件

在这里插入图片描述

五、动态库隐式调用(C/C++函数调用)

1)新建空项目

(1)新建一个空项目;

(2)将生成的name.lib、name.dll及xx.h文件复制进新建空项目所在的文件夹中;

(3)属性管理器中选择对应解决方案与平台,右击添加附加依赖项name.lib;

(4)右键头文件,添加现有项,将刚刚复制来的xx.h文件添加进入当前项目;
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2)连接测试

(1)#include"xx.h"

(2)编写函数测试:

在这里插入图片描述

六、动态库显式调用(C/C++函数调用)

1)创建函数指针(类型要与.dll中的函数一致);

typedef int(*name)();

2)定义句柄,用于引用动态库;

HMODULE hdll;
引用动态库;

3)引入window头文件

#include;

4)加载动态库;

LoadLibrary(L"“);或LoadLibraryA(”");

5)调用函数;

auto dll = (name)GetProcAddress(hdll.“函数名”);

6)释放动态库句柄

步骤②中定义的句柄,FreeLibrary(句柄名称);

7)设置解决方案配置与平台,要与动态库一致,最后调试运行。

七、动态库封装(C/C++类导出)

1)创建动态库项目

(具体参考本篇文章第四部分的 1))

2)创建头文件并导出需要的类

类的导出,实际是将类中函数进行导出;

(1)创建.h头文件(名称自定);
(2)导出方式确定,以C或C++方式;
(3)选中导出的函数名或类名 Alt + Enter ,在对应的同名源文件中创建对应类中包含的函数的定义;
在这里插入图片描述

3)生成动态库文件

在这里插入图片描述

八、动态库隐式调用(C/C++类调用)

1)新建空项目

(具体参考本篇文章第五部分的 1))

2)连接测试

(1)#include"xx.h"

(2)写函数测试

在这里插入图片描述

九、动态库显式调用(C/C++类调用)

1)创建函数指针(类型要与.dll中的函数一致);

typedef int(*name)();

2)定义句柄,用于引用动态库;

HMODULE hdll;
引用动态库;

3)引入window头文件

#include;

4)加载动态库;

hdll = LoadLibrary(L".dll");或 hdll = LoadLibraryA(“.dll”);

5)调用函数;

auto dll = (name)GetProcAddress(hdll.“函数名”); 注意:在导出的动态库为C++类型时,应填写函数名对应的真实名称,因为C的为函数原名称,C++的则是加上一些符号,这是C++有类和重载的缘故。用depends查看对应的完整名称。

6)释放动态库句柄

步骤②中定义的句柄,FreeLibrary(句柄名称);

“.dll”);

5)调用函数;

auto dll = (name)GetProcAddress(hdll.“函数名”); 注意:在导出的动态库为C++类型时,应填写函数名对应的真实名称,因为C的为函数原名称,C++的则是加上一些符号,这是C++有类和重载的缘故。用depends查看对应的完整名称。

6)释放动态库句柄

步骤②中定义的句柄,FreeLibrary(句柄名称);

7)设置解决方案配置与平台,要与动态库一致,最后调试运行。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值