定义
动态链接库(DLL):在程序运行的时候,连接库,程序发布的时候,还需要将库一并打包,不然别人用不了。
静态链接库:在程序编译的时候,链接库,就是把库的代码去全部包含到文件中,将文件一次性发给别人,别人就能用
优点
如果某个库需要更新,那么静态链接库需要把文件全部更新,因为库包含在文件里面,而动态链接库只需要更新库即可,因为库和文件是分开的
创建
文件>>>>>新建>>>>>搜索dll,创建动态链接库文件
最开始直接运行,是不能运行的,动态链接库怎么能直接运行,它只是一个库
我们给它加上函数
int ave(int a, int b)
{
return (a + b) / 2;
}
写好后,我们还需要把函数进行导出,如果不导出,别人就无法知道我们这个库里有哪些函数
,也就无法使用这个库,所以要导出
第一种方法__declspec (dllexport)
extern "C" __declspec (dllexport)int ave(int a, int b)
{
return (a + b) / 2;
}
以C风格进行导出,因为如果以C++风格进行导出,就会对生成的函数名矫正
但同时,要在头文件里声明一下这个函数
dll.h文件
#pragma once
extern "C" _declspec (dllexport)int ave(int a, int b);
第二种方法
右键====工程====>添加===>新建项=====>vc++===代码====>模块定义文件
EXPORTS
ave
ave表示要导出的函数名,注意,这里最好不要用函数重载,因为EXPORTS无法导出同名函数
第三种方法
#pragma comment(linker,"/export:ave=_ave@8")
指定导出函数名
调用
第一步,新建一个控制台程序
第二步 生成依赖项,右键工程===生成依赖项===项目依赖项
这一步,因为我们要从控制台调用动态库
第三步 将动态链接库生成后的文件名修改为2.dll,并加载它
HMODULE hmod = LoadLibraryA("2.dll");
if (hmod)
{
std::cout << "模块加载成功"<<std::endl;
这里我们查看定义,HMODOLE是一个指针类型
第四步 得到函数地址
typedef int (*FARR)(int a, int b);
FARR func = (FARR) GetProcAddress(hmod, "ave");
std::cout << func(200, 300);
查看getprocaddress的定义,它的返回值是一个函数指针,所以我们定义了一个FARR类型的函数指针并进行强制转换。 并且调用它,成功输出了我们需要的值