C++ 基于vs2019创建并使用动态链接库(dll)

VS2019中C++动态链接库(DLL)的创建与调用 VS2019中C++动态链接库(DLL)的创建与调用,及一些进阶技巧。 阅读详情
AI摘要

本文介绍了静态库和动态库的基本概念、作用以及各自的优缺点。静态库在编译时链接,常用于代码重用和隐藏实现细节,但可能导致编译时间增加;动态库在运行时链接,节省空间且便于更新,但增加加载时间。同时,详细讲解了DLL项目中头文件和实现的组织方式以及如何在项目间导入导出功能。

库的基本认识

静态库(Static Library)

  • 基本概念:静态库是在编译时链接到目标程序中的库文件。它包含了程序运行所需的所有函数和数据,这些函数和数据会被直接嵌入到最终生成的可执行文件中。静态库通常以.a(在Unix-like系统中)或.lib(在Windows系统中)为文件扩展名。
  • 作用:
    • 代码重用:静态库允许开发者将常用的代码或功能封装成库,以便在多个项目或模块中重复使用。
    • 隐藏实现细节:通过静态库,开发者可以隐藏某些函数或数据的实现细节,只提供必要的接口供其他开发者使用。
    • 减小可执行文件大小:虽然静态库本身较大,但多个使用相同静态库的可执行文件在磁盘上的总存储空间可能会减小,因为它们共享相同的代码段。
    • 增加编译时间:由于静态库在编译时链接到目标程序中,因此每次编译都会重新处理库中的代码,这可能导致编译时间增加。
    • 不便于更新:如果静态库中的代码需要更新,那么所有使用该库的可执行文件都需要重新编译。

动态库(Dynamic Library)

  • 基本概念:动态库是在运行时链接到目标程序中的库文件。它包含了程序运行所需的一些函数和数据,但这些函数和数据在程序运行时才会被加载到内存中。动态库通常以.so(在Unix-like系统中)或.dll(在Windows系统中)为文件扩展名。
  • 作用:
    • 代码重用:与静态库类似,动态库也允许开发者将常用的代码或功能封装成库,以便在多个项目或模块中重复使用。
    • 节省磁盘空间:由于动态库在多个可执行文件之间共享,因此可以节省磁盘空间。
    • 减少内存使用:当多个程序使用相同的动态库时,它们可以共享内存中的同一份库代码,从而减少内存使用。
    • 便于更新:如果动态库中的代码需要更新,只需要替换库文件即可,而无需重新编译使用该库的可执行文件。
    • 增加加载时间:由于动态库在程序运行时才链接,因此可能导致程序加载时间增加。此外,如果动态库丢失或损坏,程序将无法正常运行。

总的来说,静态库和动态库各有优缺点,开发者需要根据具体需求选择合适的库类型。例如,在需要隐藏实现细节或减小可执行文件大小的场景中,可以使用静态库;而在需要节省磁盘空间、减少内存使用或便于更新的场景中,可以使用动态库。

文件结构与原理

  • 在 dll 项目中,我们建议将函数、类…代码的声明放到 .h的头文件中,而它的具体实现将放到 .cpp 文件中。
  • 这样做不仅可以让项目的结构更加清晰,而且还起到一个很重要的作用:在 .h 头文件中的代码,可以巧妙利用宏定义,实现动态的声明——头文件为 dll 项目的 .cpp 文件的函数、类…声明"向外导出",又可以为未来要使用 dll 的应用程序声明"向里面导入"。

dll 的创建

创建一个空项目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

编写你的代码

  • 在 MyDll.h 文件中编写代码:

在这里插入图片描述

  • 想直接复制粘贴的朋友看这里:
#pragma once

#ifdef MYDLL
#define PORT __declspec(dllexport)
#else
#define PORT __declspec(dllimport)
#endif

PORT int add(int a, int b);
PORT int sub(int a, int b);

class PORT Circle
{
private:
	float radius;
	float area;

public:
	Circle(float);
	float getRadius();
	float getArea();
};
  • 想要研究源码的朋友看这里:
#pragma once	// 预处理指令,用于确保头文件在一个编译单元中只被包含一次,助于防止重复定义和链接错误


// 下面的宏代码是用来判断,当前那个项目在使用"头文件"
/*
	原理是:通过在DLL项目配置一个 MYDLL 的宏定义,而在 exe 项目里面不配置 MYDLL 的宏定义
	当此头文件被DLL项目使用时,MYDLL必然是有定义的,从而执行 "#define PORT __declspec(dllexport)"这一句代码
	当此头文件被exe项目使用时,MYDLL必然是没有定义,从而执行 "#define PORT __declspec(dllimport)"这一句代码
	最终在不同项目下,PORT 有着不同的功能
	在DLL项目里面,POET 将起到 "导出"的作用
	在exe项目里面,POET 将起到 "导入"的作用
*/
#ifdef MYDLL						// 如果 MYDLL 有定义,说明当前头文件是"DLL项目"在使用
#define PORT __declspec(dllexport)  // 将 PORT 定义为 导出功能
#else								// 如果 MYDLL 没有定义,说明当前头文件是"exe项目"在使用
#define PORT __declspec(dllimport)	// 将 PORT 定义为 导入功能
#endif


// 在下面编写你的代码的"声明部分"

// 导入或导出————函数
PORT int add(int a, int b);		// 详细写法:extern "C" PORT int add(int a, int b);
PORT int sub(int a, int b);		// 详细写法:extern "C" PORT int sub(int a, int b);


// 导入或导出————类
class PORT Circle	// 声明一个圆的类
{
private:
	float radius;	// 圆的半径
	float area;		// 圆的面积

public:
	Circle(float);
	float getRadius();
	float getArea();
};
  • 在 MyDll.cpp 文件中编写:

在这里插入图片描述

  • 源码如下:
#include "MyDll.h"

/*
	这里是 DLL 项目的具体实现:
	而在 DLL 项目的属性中,我们需要确保 MYDLL 宏被定义
	这通常是通过在项目配置的属性页中的“C/C++” -> “预处理器” -> “预处理器定义”中添加 MYDDL 来完成的
*/


// 实现在"头文件"里面声明的函数和类...
// 如下所示:

int add(int a, int b)	// 加法
{
	return a + b;
}

int sub(int a, int b)	// 减法
{
	return a - b;
}


Circle::Circle(float radius)	// 实现一个圆
{
	this->radius = radius;
	this->area = 3.14 * radius * radius;
}

float Circle::getRadius()
{
	return this->radius;
}

float Circle::getArea()
{
	return this->area;
}

Release 模式

在这里插入图片描述

修改项目属性

  • 配置类型:

在这里插入图片描述

在这里插入图片描述

生成 dll 文件

在这里插入图片描述

找到 dll 文件

在这里插入图片描述

  • 在"解决方案" MySolution1 中,找到并打开 Release 文件夹

在这里插入图片描述

  • 如果能够找到下面两个文件就说明,生成 dll 文件成功!

在这里插入图片描述

  • 建议:复制这两个文件,并保存到一个新的文件夹中

在这里插入图片描述

找到 dll 项目的头文件

  • 回到刚才的"解决方案" MySolution1 中,点击 MyDll 文件夹

在这里插入图片描述
在这里插入图片描述

  • 建议:将这个头文件复制一份,保存到刚刚存放了 dll 文件的文件夹里面

在这里插入图片描述

dll 的三个文件

  • 我们通过创建 dll 项目,做了一系列的步骤,最终就是为了得到上面的三个文件!
  • 到此为止,我们就完成了 dll 文件的创建任务。
  • 在上面的操作里,我们在 dll 文件里面,声明了一些函数和类,而且实现了这些函数和类
  • 对于这些封装好的功能,我们如何才能使用它呢?
  • 接下来,让我们一起来看看如何使用我们所编写的 dll 文件。

dll 的使用

创建一个空白的项目

  • 我们将创建一个项目,作为一个应用程序 (exe),然后在这个应用程序里面,使用我们的 dll 文件
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

Release 模式

  • 将模式修改为:Release(实现与 dll 项目统一模式)

在这里插入图片描述

引入必要文件

原理:

  • 要使用 dll 里面封装好的实现代码,我们先要引入 dll 头文件里面的声明代码
  • 也就是说,我们想要导入头文件 #include<MyDll.h>
  • 但是,在当前这个"应用程序"的项目中,vs2019 是不知道我们已经写好了这个头文件的
  • 所以,我们需要做一些配置,告诉 vs2019 我们的头文件放在了哪里

步骤:
在这里插入图片描述

  • 告诉 vs2019 去哪个目录找头文件

在这里插入图片描述
在这里插入图片描述

  • 告诉 vs2019 去哪个目录找 lib 文件

在这里插入图片描述
在这里插入图片描述

  • 告诉 vs2019 在使用链接器进行链接时,链接哪一个 lib 文件

在这里插入图片描述
在这里插入图片描述

编写应用程序代码

在这里插入图片描述

  • 源码:
#include<iostream>
#include<MyDll.h>

using namespace std;

int main()
{
	int first, secend, radius;

	cout << "请输入两个整数:";
	cin >> first >> secend;

	cout << "两数之和:" << add(first, secend) << endl;
	cout << "两数之差:" << sub(first, secend) << endl;

	cout << "请输入圆的半径:" << endl;
	cin >> radius;

	Circle myCircle(radius);
	cout << "半径:" << myCircle.getRadius() << endl;
	cout << "面积:" << myCircle.getArea() << endl;

	system("pause");
	return 0;
}

生成应用程序(exe)

  • 生成 exe 文件

在这里插入图片描述

  • 找到生成的 exe 文件,并将它和 dll 文件放在同一个目录下

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

最终文件与运行效果

  • 最终只保留以下文件即可:

在这里插入图片描述

  • 最终运行效果:
    在这里插入图片描述

结束语:希望能够帮助到你

且看一文梳理VS2019中dll的创建使用 动态链接库(dll) Windows下有静态链接(lib)库和动态链接库(dll)两种共享代码的方式。 本文将介绍dll的应用场景,以及在vs2019平台下的生成和使用。 今天的笔记内容说的是平时经常能看见的,运行 VS 项目的时候老在下方加载的.dll。包括一小部分的理论和超大部分的实操。 [What] dll是什么 动态链接库(Dynamic Link Library)又称为“应用程...... 阅读详情

相关推荐

VS2019环境下C++动态链接库DLL的创建与调用

VS2019环境下C++动态链接库DLL## 标题的创建与调用 一、创建动态链接库 1、打开VS2019,创建新项目,选择动态链接库(DLL),点击下一步。 2、配置新项目,输入“项目名称”,然后选择工程“位置”,“解决方案名称”与“项目名称”相同,是自动生成的,不勾选“将解决方案和项目放在同一目录中”,最后点击“创建”按钮。 ...

weixin_43911610的博客 3492

VS2019-C++创建和调用DLL动态链接库(傻瓜式教程)

第三步:编写头文件(重点)

qq_44191346的博客 6047

VS2019 C++动态链接库(DLL)创建调用与排错实战指南

动态链接库(DLL)是Windows下实现代码模块化复用与独立部署的关键技术,它允许多个进程共享同一份代码,既节省内存和磁盘,也为插件化架构与热更新提供了基础支撑。在C++工程实践中,开发者经常需要将通用功能封装为DLL供多个EXE调用,但DLL的导出、隐式链接、显式加载以及各类加载失败问题往往令人头疼。理解DLL的核心原理——导出符号、调用约定、导入库与加载方式——是掌握这一技术的前提。实际应用中,无论是通过隐式链接快速集成SDK,还是借助LoadLibrary、GetProcAddress实现灵活的插件

weixin_28833069的博客 187

基于VS2019的C++动态链接库DLL生成与调用

本文深入探究了DLL文件的作用与生成及调用方式,作了详尽的实验总结,并给出了相应的实验代码。

不要仅为成功而努力,要为做一个有价值的人而努力 2585

VS2019下C++动态链接库(DLL)创建、导出与调用排坑完全指南

动态链接库(DLL)是Windows平台C++开发中实现模块化与代码复用的核心机制,它允许将功能单元编译为独立二进制,由可执行文件在运行期加载。与静态库在编译期合并代码不同,DLL通过导入符号表实现延迟绑定,从而支持多进程内存共享、独立版本迭代与插件化扩展。在实际工程中,理解导出接口的设计(如extern "C"、__declspec(dllexport)以及隐式链接、显式链接(LoadLibrary/GetProcAddress)的适用场景,是构建稳定应用的关键。但DLL也常引发“找不到DLL”、“无法定

weixin_27734811的博客 169

VS2019开发简单的C/C++动态链接库并进行调用

小白提升:VS2019开发简单的C/C++动态链接库并在解决方案中进行调用 一、 vs2019简单动态链接库的开发 1.VS2019新建立一个空项目(DLL1) VS有提供dll项目的模板,可是对于我来说反而搞不懂模板中的文档,于是建立空白项目,自己去做简单的配置。 2.解决方案管理器中为项目添加一个头文件,选择新建项 在新建的头文件(DDL.h)中声明要导出的API,我添加一个简单的加和函数: ...

KS004的博客 1万+

VS2019环境下C++动态链接库(DLL)的创建与调用

VS2019环境下动态链接库DLL的创建与调用(动态调用隐式链接) 一、实验环境 VS2019、Win10 二、创建动态链接库(DLL) 首先,我们需要知道动态链接库(以下简称DLL)的作用,我在这里总结为,可以重复使用功能相同的代码,而不必对已经实现了的功能重新编写代码。链接库有动态和静态两种,本文旨在记录如何实现DLL的创建与调用,故不对这两种链接库做探讨。接下来让我们开始实验吧 步骤<1>:创建新项目 创建新项目–>动态链接库(DLL) 步骤<2>:配置新项目

modi000的博客 7560

VS2019 使用 C/C++ 动态链接库 并 进行调用

vs2019生成dll并调用的实现示例:https://www.jb51.net/article/179759.htm vs2017创建linux c++程序:https://blog.youkuaiyun.com/qingyulove/article/details/86659726 vs2019编写Linux c/c++项目:https://blog.csd...

墨鱼菜鸡 1745

VS2019创建c++动态链接库dll与调用方法

头文件.h。

Txwtech 1108

Windows 系统 使用 VS2019 编写 python 的 C++ 拓展

文章目录测试环境拓展模块目标具体步骤 测试环境 VS 2019 安装 “使用C++的桌面开发工作负载”,如下图 Anaconda3 64 位系统 拓展模块目标 C++ 实现基本的加减乘除函数,Python 进行调用 具体步骤 在 VS2019 中创建一个 动态链接库(DLL) 解决方案 项目名称 MyMath,创建,自动生成如下文件,解决方案资源管理器界面如下 设置项目属性,分别是 附...

weixin_43852511的博客 1834

C#【必备技能篇】VS2019 使用C/C++ 生成DLL 文件,并用 C/C++、C#调用DLL

在C#开发软件的过程中,要经常调用C/C++生成的dll,本文主要介绍用C/C++生成dll的步骤,以及用C/C++、C#两种语言实现dll的引用实现。本文使用的IDE是VS2019,文章通过具体实例进行讲解,大家可以跟着自己动手进行测试。

星Yeah 的博客 9911

VS2019 C++动态链接库(DLL)开发全指南:从创建到调试部署

动态链接库(DLL)是Windows平台上实现代码复用、模块隔离与热更新的核心技术,它将共享功能封装为二进制模块,供多个进程独立加载,既节省内存又便于独立升级。理解其工作原理,开发者可以更高效地管理复杂工程的依赖关系。在实际开发中,通过Visual Studio 2019这一主流IDE,我们可以使用C++快速构建DLL,并借助导出宏、extern "C"或.def文件设计清晰的接口。无论是通过隐式链接的导入库方式,还是利用LoadLibrary与GetProcAddress进行动态加载,掌握正确的调用策略都

weixin_31842715的博客 57

VS2019封装C++接口至可执行动态链接库.dll

VS2019封装C++接口至可执行动态链接库.dll

yohnyang的博客 1539

VS2019 - 动态库的编写和调用

在部署AI模型时候需要封装模型,因此对其中的一个步骤——编写和调用动态链接库,进行了学习

qq_22487889的博客 1905

C++动态链接库(DLL)的创建和调用(VS2019)

动态链接库(Dynamic Link Library,DLL)是一个包含可由多个程序同时使用的代码和数据的库。通俗来讲,它就是一个仓库,提供一些可以直接拿来用的变量、函数或者类。

iambinglan1的博客 5164

Frida实战:如何逆向分析某电商App的doCommandNative函数(附完整Hook脚本)

本文详细介绍了如何使用Frida逆向分析电商App中的doCommandNative函数,涵盖动态注册识别、SO加固对抗及高级Hook脚本编写等实战技巧。通过完整Hook脚本示例,帮助安全研究人员深入理解JNICLibrary的关键函数逆向分析方法,提升移动应用安全研究能力。

weixin_29327977的博客 615

使用C++生成dll(动态链接库),并用python调用

说明:windows下的动态链接库相当于linux下的共享库,它可以类比为具有一系列特定函数的接口可供各种程序调用。同时,由于一般安装的python都是64位的,而生成的动态链接库可能是32位的也可能是64位的,这就导致动态链接库在pyhon中调用的时候会出现不匹配的问题。本篇博客意在使用C++生成64位的dll,然后供python调用...

qq_273058791的博客 6058

.ipynb文件深度解析:从JSON结构到Jupyter Notebook高效使用指南

在Python开发与数据处理领域,交互式编程正成为探索数据与验证思路的高效方式。Jupyter Notebook作为最流行的交互式环境之一,其默认文件格式.ipynb本质是一个基于JSON的文本文件,内部通过单元格组织代码、说明文字与运行结果。理解其JSON结构,不仅有助于掌握Notebook的存储原理,更能为文件损坏修复、版本控制与自动化转换提供基础。依托对单元格类型、魔法命令及输出可视化的熟练运用,数据分析和数据可视化流程可以变得更为流畅。同时,借助VS Code、nbconvert等工具,开发者能将.

weixin_28839629的博客 347
上一篇: C++ 网络编程
下一篇: Python 技能提升(一)
code_stream
博客等级 码龄4年 1238粉丝 169原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值