0
点赞
收藏
分享

微信扫一扫

qtcanpool 知 99:常见问题

DT_M 2023-06-04 阅读 8

定义

动态链接库(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类型的函数指针并进行强制转换。 并且调用它,成功输出了我们需要的值

举报

相关推荐

常见问题

Linux常见问题

nginx常见问题

PHP常见问题

oracle常见问题

0 条评论