VS 动态库(dll)的制作和调用

时间:2024-04-03 16:12:28

参考文献:
https://blog.csdn.net/qq_37902078/article/details/80144696
https://blog.csdn.net/shimadear/article/details/89202714
https://blog.csdn.net/Lunar_Queen/article/details/82872157
http://www.runoob.com/w3cnote/cpp-static-library-and-dynamic-library.html

1.文件->新建->项目->选择Visual C+±>Windows桌面->动态链接库
新建成功之后,默认为x86平台。按照你自己的需求更换平台,生成和调用的dll必须为同一个平台。本次设置为Debug x64平台。
VS2017 动态库(dll)的制作和调用
2. 可以看到解决方案自带两个头文件stdafx.h和targetver.h。
VS2017 动态库(dll)的制作和调用
3.右键头文件->添加->新建项->选择头文件,新建一个stack.h。
这个头文件里面有一个#pragma once,这个东西保证头文件只被编译一次。代码如下:
#pragma once
#include"stdafx.h"
#ifdef STACK_EXPORTS
#define STACK_EXP __declspec(dllexport)
#else
#define STACK_EXP __declspec(dllimport)
#endif

class STACK_EXP Stack
{
private:
int *data; //存放栈数据
int count; //存放栈顶指针
int size; //栈的容量
public:
Stack(int stacksize = 10); //构造函数建立具有10元素的默认栈
~Stack();
void Push(int x); //元素入栈
int Pop(); //元素出栈
int howMany(); //判定栈中有多个元素
};

// 解释一下:我们想要导出一个类来供客户端程序使用,那么需要在提供给客户端程序使用的类的头文件中 class 和类名之间加上 __declspec(dllimport),而在我们编译这个 DLL 项目的时候,则需要使用 __declspec(dllexport)。

4.将MyFirstDLL.cpp改成stack.cpp,
定义DLL应用程序的导出函数,代码如下:
#include"stdafx.h"
#include “stack.h” //包含头文件
#include //push和pop都用到了cout,所以包含此头文件
using namespace std;
Stack::Stack(int stacksize)
{
if (stacksize > 0)
{
size = stacksize;
data = new int[stacksize];
for (int i = 0; i < size; i++)
data[i] = 0;
}
else
{
data = 0;
size = 0;
}
count = 0;
}

Stack::~Stack()
{
delete[]data;
}
void Stack::Push(int x)
{
if (count < size)
{
data[count] = x;
count++;
}
else
{
cout << "堆栈已满,不能再压入数据: " << x << endl;
}
}
int Stack::Pop()
{
if (count <= 0)
{
cout << “堆栈已空!” << endl;
exit(1); //堆栈操作失败,退出程序!
}
count–;
return data[count];
}
int Stack::howMany()
{
return count;
}

5.生成解决方案。
环境配置: Debug x64 , 生成→生成解决方案
VS2017 动态库(dll)的制作和调用
在配置属性→常规→配置类型,选择动态库(.dll),不过一般就是默认值。
VS2017 动态库(dll)的制作和调用
VS2017 动态库(dll)的制作和调用
生成:成功1个。
可以在项目文件夹x64/Debug目录下看到dll和lib文件。lib是我们写在程序中添加的文件,dll是我们在生成程序之后要使用的文件。

7.测试DLL。新建一个空项目:文件->新建->项目
VS2017 动态库(dll)的制作和调用
8、环境配置
方法1:
刚才DLL项目中的头文件stack.h、stdafx.h、targetver.h和生成的MyFirstDLL.lib文件复制到MyFirstDLL-test项目根目录下:
VS2017 动态库(dll)的制作和调用
刚刚生成的MyFirstDLL.dll文件放到Debug目录(没有这个目录就先生成解决方案,有了Debug目录后再放文件进来,一切准备好以后再重新生成解决方案):
VS2017 动态库(dll)的制作和调用

然后在右侧头文件中添加stack.h、stdafx.h、targetver.h(也可以不加),资源文件中添加MyFirstDLL.lib
VS2017 动态库(dll)的制作和调用
其中,要在项目->属性->C/C+±>代码生成->运行库->改成DLL(/MDd)
VS2017 动态库(dll)的制作和调用
方法二:
环境配置也可如下设置:
MyFirstDLL.dll 放在E:\1-C++\VS2017 动态库的制作\MyFirstDLL-test\x64\Debug中或放在根目录都可以。
在根目录新建文件夹h和lib,将stack.h、stdafx.h、targetver.h放到文件夹h中,将MyFirstDLL.lib放到文件夹lib中。
在属性管理器→Debug|64,双击Microsoft.Cpp.x64.user,打开属性页,在C/C++中的附加包含目录输入文件夹h的路径,在链接器→常规→附加库目录中输入文件夹lib的路径,在输入→附加依赖项 中输入 MyFirstDLL.lib。
VS2017 动态库(dll)的制作和调用

9、添加cpp
添加stackmain.cpp,加入代码如下:
#include"stdafx.h"
#include “stack.h”
#include
using namespace std;
void main()
{
Stack s1;
s1.Push(1);
s1.Push(12);
s1.Push(32);
int x1 = s1.Pop();
int x2 = s1.Pop();
int x3 = s1.Pop();
cout << x1 << “\t” << x2 << “\t” << x3 << endl;
system(“PAUSE”);
}

10、运行试验
运行环境设置: Debug x64
VS2017 动态库(dll)的制作和调用
运行成功:
VS2017 动态库(dll)的制作和调用

将运行环境设置为:Release x64,并在属性管理器中进行同样的设置(同Debug|64):
(如果按照方法一进行配置,要把MyFirstDLL.dll放在E:\1-C++\VS2017 动态库的制作\MyFirstDLL-test\x64\Release 中或放在根目录下。)
VS2017 动态库(dll)的制作和调用
运行也成功。

工程属性页->配置属性->C/C+±>代码生成中的运行库有四个,其对应的方式分别为:

多线程(/MT) 静态库 release版本

多线程调试(/MTd) 静态库 debug版本
多线程DLL(/MD) 共享dll release版本
多线程调试DLL(/MDd) 共享dll debug版本

作者:shudaxia123
来源:CSDN
原文:https://blog.csdn.net/shudaxia123/article/details/22058463
版权声明:本文为博主原创文章,转载请附上博文链接!