目录
一,生成动态链接库
二,使用动态链接库
一,生成动态链接库
1.打开VS2019,创建新项目,选择 动态链接库(DLL) 模板后进行下一步
2.输入项目名称,其它默认就行(可自行选择),点击创建
3 工程界面架构默认显示如下
4.右键工程名,点击 添加—>新建项,选择 C++类 并输入类名,点击添加,在添加类页面直接点击确定即可
5.在新添加 demoDLL.h 头文件中测试如下代码
#pragma once
#include <iostream>
//__declspec(dllexport)作用:告诉编译器和链接器被它修饰的类,函数或变量生成DLL后,能被外界调用
#define LIBRARY_API __declspec(dllexport)
#ifdef __cplusplus
extern "C" //指示编译器这部分代码按C语言的进行编译,而不是C++的,能够正确实现C++代码调用其他C语言代码
{
#endif
LIBRARY_API void One();
LIBRARY_API int Two(int a, int b);
void Three(); //未加 LIBRARY_API,调用DLL是否能使用全局函数
class LIBRARY_API A {
//测试在类名称前加 LIBRARY_API,调用DLL是否能使用类内成员
public:
void Four();
static void Five();
};
class B {
//测试在类名称前不加 LIBRARY_API,而是在类内个别函数加 LIBRARY_API,调用DLL是否能使用类内成员
public:
LIBRARY_API void Six();
static void Seven();
};
#ifdef __cplusplus
}
#endif // __cplusplus
6.在新添加 demoDLL.cpp 源文件中测试如下代码
#include "pch.h"
#include "TestDLL.h"
void One()
{
std::cout << "DLL_函数接口:One()" << std::endl;
}
int Two(int a, int b)
{
std::cout << "DLL_函数接口:Two()" << std::endl;
return a + b;
}
void Three()
{
std::cout << "DLL_函数接口:Three()" << std::endl;
}
void A::Four()
{
std::cout << "DLL_A类成员函数接口:Four()" << std::endl;
}
void A::Five()
{
std::cout << "DLL_A类成员静态函数接口:Five()" << std::endl;
}
void B::Six()
{
std::cout << "DLL_B类成员函数接口:Six()" << std::endl;
}
void B::Seven()
{
std::cout << "DLL_B类成员静态函数接口:Seven()" << std::endl;
}
7.右击工程名称,选择生成,然后会在工程目录Debug目录下生成 dll 和 lib 库文件(可自行选择Debug模式还是Release模式,32位还是64位)
二,使用动态链接库
1.将生成 CreateDLL.dll,CreateDLL.lib 拷贝一份到新建的 DLL/lib 目录下,将生成动态库的所有头文件 framework.h,pch.h,demoDLL.h 拷贝一份到新建的 DLL/include 目录下
2.新建一个工程(名称:userDLL)来测试该动态链接库,在项目属性页窗口进行配置
3.并在链接器的输入下,附加依赖项指定加载的动态库对应的lib文件
4.新建cpp文件并编写如下测试代码,另外也验证一下 __declspec(dllexport)
#include <iostream>
using namespace std;
#include "demoDLL.h"
int main()
{
One();
std::cout << Two(21, 25) << std::endl;
//Three();//编译不通过:说明全局函数未加 __declspec(dllexport) 声明不能被外部调用
A a;
a.Four();
A::Five();
B b;
b.Six();
//B::Seven();//编译不通过:进一步说明只要未加 __declspec(dllexport) 声明就不能被外部调用
return 0;
}
5.但这里运行报了如下错误,解决办法是将 CreateDLL.dll 拷贝一份到该工程目录下就行
6.最后运行成功了,大功告成!!!