【C/C++】VS2019下C++生成DLL并且成功调用(金针菇般细)

目录

一,生成动态链接库

二,使用动态链接库


一,生成动态链接库

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 "demoDLL.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目录下生成 dlllib 库文件(可自行选择Debug模式还是Release模式,32位还是64位

二,使用动态链接库

1.将生成 CreateDLL.dll,CreateDLL.lib 拷贝一份到新建的 DLL/lib 目录下,将生成动态库的所有头文件 framework.h,pch.h,demoDLL.h 拷贝一份到新建的 DLL/include 目录下

2.新建一个工程(名称:userDLL)来测试该动态链接库,在项目属性页窗口进行配置

3.并在链接器的输入下,附加依赖项指定加载的动态库对应的lib文件

或者在代码中添加下面一行,与附加依赖项是一样的

#pragma comment(lib,"CreateDLL.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.最后运行成功了,大功告成!!!

猜你喜欢

转载自blog.csdn.net/weixin_43729127/article/details/128977461