0%

C++生成DLL动态链接库

C++动态链接库介绍

Dynamic Link Library(DLL)是微软在Windows系统中实现共享函数库概念的一种方式,常见的后缀为“.dll”,其优点是不会包含在程序编译文件中,而是在运行过程中调用,并且可以被多个程序公用,不需要在每个程序中都附加上相同的代码。


生成C++动态链接库

我的运行环境是Win10+VS2017,打开vs2017后,新建空的C++项目
假设我要创建一个名为math1.dll(因为C++本身就有一个叫math.h的数学方法库,不能与其重名,所以加了数字1)的动态链接库,并且包含在GodricDll的命名空间中,编写一个math1的类,其中包含一个构造函数math1,可以初始化该类的实例,包含一个求两个数和的方法sum,以及两个私有变量a和b。
首先在资源管理器的源文件处新建名为math1.cpp的空白源文件,在头文件处添加名为math1.h的空白头文件。
资源管理器
头文件的内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#endif
#ifndef MATH1_H
#define MATH1_H
namespace godricdll
{
class MATH1_API math1
{
public:
math1(int theA, int theB);
int sum();
private:
int a;
int b;
};
}
#endif

头文件math.h中从#ifndef MATH1_H到最后的#endif,是为了防止头文件被重复加载,#ifndef MATH1_API是为了防止宏重复定义,可以看到代码中间部分包括在godricdll命名空间中,定义了math1类。
源文件包含类的实现,其内容如下:

1
2
3
4
5
6
7
8
9
10
11
#include "math1.h"//包含math.h头文件
#define MATH1_API _declspec(dllexport)
using namespace godricdll;//使用godricdll命名空间
MATH1_API math1::math1(int theA, int theB):a(theA), b(theB)//构造函数的实现
{

}
MATH1_API int math1::sum()
{
return a + b;
}

头文件和源文件已经编写完成,设置好debug或者release,以及32或64位,还需要将生成类型由.exe转为.dll,右键点击myDll项目,打开属性,配置属性->常规->项目默认值->配置类型,将配置类型更改为”动态库(.dll)”。
这样就可以生成解决方案了,生成完成后可以在debug或release中找到以下文件:
生成的文件

然后新建一个项目叫importDll,可以是控制台程序,在源文件出添加importDll.cpp文件,其源码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <math1.h>
using namespace godricdll;
using namespace std;

int main()
{
math1 m1(4,5);
cout << m1.sum()<<endl;
int x;
cin>> x;
return 0;
}

当然还需做一些配置将math1.h、math1.lib及math1.dll放到正确的文件夹,来调用math1.dll。
右键importDll,选择”属性”
配置属性->VC++目录->包含目录(包含放置math1.h文件的文件夹)和库目录(包含math1.lib文件的文件夹);
配置属性->链接器->输入->附加依赖项(包含math1.lib)
将math1.dll文件放入importDll的debug或者release文件夹中
至此配置结束,可以运行importDll了
importDll源码及运行结果
上面就是importDll源码及运行结果。