Windows下C++动态链接库的生成以及使用

一.前言

这篇文章简单讨论一下Windows下如何使用VS生成和使用C++动态链接库,示例使用VS2022环境。

二.生成动态链接库

先创建C++项目-动态链接库(DLL)
在这里插入图片描述

在这里插入图片描述

然后将默认生成的.h和.cpp文件清理干净,当然你也可以选择保留。

然后创建需要的.h和.cpp文件。

在这里插入图片描述

看下代码

//dll_demo_config.h

#ifndef DLL_DEMO_CONFIG_H
#define DLL_DEMO_CONFIG_H

#ifdef DLLDEMO_EXPORTS
  #define DLL_DEMO_EXPORT __declspec(dllexport)
#else
  #define DLL_DEMO_EXPORT __declspec(dllimport)
#endif // DLLDEMO_EXPORTS

#endif // !DLL_DEMO_CONFIG_H
#ifndef DLL_DEMO_H
#define DLL_DEMO_H

#include<string>

#include"dll_demo_config.h"

class DllDemo
{
public:
	DllDemo(void) = default;
	~DllDemo(void) noexcept = default;
	DLL_DEMO_EXPORT void Print(std::string& msg);
};

#endif // !DLL_DEMO_H
//dll_demo.cpp

#include"dll_demo.h"

#include<iostream>

void DllDemo::Print(std::string& msg)
{
	std::cout << "msg:" << msg << std::endl;
}

很简单的代码,就是提供一个打印字符串的接口。

解释一下代码中的要点

#ifdef DLLDEMO_EXPORTS
  #define DLL_DEMO_EXPORT __declspec(dllexport)
#else
  #define DLL_DEMO_EXPORT __declspec(dllimport)
#endif // DLLDEMO_EXPORTS

可以看到这里有个宏是DLLDEMO_EXPORTS,那这个宏是在哪里定义的呢,其实是创建DLL项目的时候,VS自动定义好的,在项目属性-C/C+±预处理器-预处理器定义里面可以看到

在这里插入图片描述

或者在其他地方也可以看到,比如在项目属性-C/C+±命令行里面。

这个宏主要就是用来区分使用 __declspec(dllexport) 还是 __declspec(dllimport)

为什么要区分呢,简单解释一下:

  • __declspec(dllexport)用来声明将函数等导出。

  • __declspec(dllimport)用来声明函数等是从外部导入的。

  • 由于这个DLL项目定义了DLLDEMO_EXPORTS宏,所以在这个DLL项目中使用__declspec(dllexport),表示需要将相关的函数导出。

  • 而用到这个DLL库的项目由于不曾定义DLLDEMO_EXPORTS,所以在这些项目中就会使用__declspec(dllimport),表示相关函数是从外部导入的。

class DllDemo
{
public:
	DllDemo(void) = default;
	~DllDemo(void) noexcept = default;
	DLL_DEMO_EXPORT void Print(std::string& msg);
};

这里DLL_DEMO_EXPORT对Print进行修饰,就是在声明Print是需要导出还是从外部导入,在这个项目中就是导出。

解释好了,编译一下,但是这个时候你会发现项目不能编译。

报错

在这里插入图片描述

这是因为清理了生成的默认文件,需要在项目属性-C/C+±预编译头-预编译头,改为不使用预编译头就可以了。

在这里插入图片描述

编译生成了dll_demo.lib和dll_demo.dll,这样动态库生成就是完成了。

三.使用动态链接库

我们看一下怎么使用动态库,创建C++项目-空项目,编写exe程序,这个exe程序会调用动态库。

在这里插入图片描述

看下代码

//main.cpp

#include<string>

#include"dll_demo.h"

int main(int argc, char* argv[])
{
	DllDemo dllDemo;
	std::string strMsg("exe_demo");

	dllDemo.Print(strMsg);

	return 0;
}

其实就是很简单的代码。
执行结果

在这里插入图片描述

需要注意的是:

  • 需要在项目属性-C/C+±常规-附加包含目录,设置项目包含的头文件所在位置。

  • 需要在项目属性-链接器-常规-附加库目录,设置项目依赖的库文件(.lib)所在位置。

  • 需要在项目属性-链接器-输入-附加依赖项,设置项目依赖的库文件(.lib)。

  • 动态库.dll文件需要和可执行.exe文件在同一目录下。

四.其他

1.也可以使用其他的方式创建动态链接库项目,比如创建C++项目-Windows桌面向导

在这里插入图片描述

2.建议自定义配置.lib/.dll/.exe等文件的生成目录。

3.建议在解决方案-项目依赖项/项目生成顺序中指定同一个解决方案中的项目依赖规则

在这里插入图片描述

  • 12
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值