c++动态链接库dll的封装和调用

动态链接库dll的简单介绍

将反复使用的函数,或者多个项目都会共同调用的模块封装成一个库函数让项目去调用。

动态链接库的优势:

  1. 让程序更好的模块化,增加模块的复用率
  2. 对应模块的代码升级,只需要编译dll文件,其他的代码不需要更新
  3. 进程之间只需要一份动态库实例就行了,可以进行共享

对动态链接库进行封装的方法

  1. 使用导出符修饰函数或者类来说明需要导出的模块,修饰符:__declspec(dllexport)
  2. 使用visual studio 自带的模块定义文件(.def)来声明要导出的函数

在本文中主要使用vs2022来编写对应的例子

使用__declspec(dllexport)来封装dll

打开vs2022创建新项目,选择动态链接库

c++动态链接库dll的封装和调用_第1张图片新建好项目之后能看到四个文件

c++动态链接库dll的封装和调用_第2张图片

创建好动态链接库对应的头文件和cpp文件

#pragma once
#include
#define DLL_EXPORT __declspec(dllexport)

DLL_EXPORT int Add(int m, int n);
DLL_EXPORT int Sub(int m, int n);

class DLL_EXPORT Operation
{
public:
	int Value;
public:
	int Mul(int m, int n);
	int Div(int m, int n);
};
#include "pch.h"
#include "operation.h"

int Add(int m, int n)
{
	return m + n;
}

int Sub(int m, int n)
{
	return m - n;
}


int Operation::Mul(int m, int n)
{
	return m * n;
}

int Operation::Div(int m, int n)
{
	return m / n;
}

使用 __declspec(dllexport) 来修饰函数,这个函数能进行导出,其他的程序能进行调用,

使用__declspec(dllexport) 来修饰类,则整个类里面的方法都能进行导出。

使用模块定义文件(.def)来声明要导出的函数

创建文件的方法和之前是相同的,具体区别是不需要使用__declspec(dllexport)

#pragma once
int Add2(int m, int n);
int Sub2(int m, int n);

对应的cpp文件

#include "pch.h"
#include "opreation2.h"


int Add2(int m, int n)
{
	return m + n;
}

int Sub2(int m, int n)
{
	return m - n;
}

关键是要创建对应的def文件

c++动态链接库dll的封装和调用_第3张图片

LIBRARY Opreation2.dll

EXPORTS
Add2   @100
Sub2   @101

对动态链接库dll进行调用

上面用三种方法创建了导出函数,_declspec(dllexport)修饰函数,_declspec(dllexport)修饰类,在def文件中进行声明

在这个部分中,我们三种导出函数都进行调用,来进行验证

在属性->vc++目录->库目录这里选择 lib文件生成的目录 ,写进去,这样我们的程序才能找到对应的lib文件

c++动态链接库dll的封装和调用_第4张图片我们在上个步骤中生成的dll和lib文件都在这个目录下面

c++动态链接库dll的封装和调用_第5张图片

在连接器->输入那里,选择我们要调用的lib文件

c++动态链接库dll的封装和调用_第6张图片最后在主程序中引用头文件,调用之前封装的导出函数就可以了

#include 

#include "../Operation/operation.h"
#include "../Opreation2/opreation2.h"



int main()
{
    Operation obj_opera;
    int val = Add(1, 2);
    std::cout << val<< std::endl;

    val = Sub(4, 3);
    std::cout << val << std::endl;

    val = obj_opera.Mul(4, 3);
    std::cout << val << std::endl;

    val = obj_opera.Div(4, 3);

    std::cout << val << std::endl;

    val = Add2(1, 2);

    std::cout << val << std::endl;
}

你可能感兴趣的:(C++,c++,windows,开发语言)