C/C++动态链接库的封装和调用

news2024/11/15 17:27:42

1 引言

静态链接库是在编译时被链接到程序中的库文件,在编译时,链接器将静态链接库的代码和数据复制到最终的可执行文件中。动态链接库是在程序运行时加载的库文件,在编译时,可执行文件只包含对动态链接库的引用,而不包含实际的库代码和数据。静态链接库占更多存储内存,程序比较大;动态链接库占更多运行内存。 

2 动态链接库封装步骤

① 新建一个“封装”工程,取名为DLLPackage。

② 新建一个头文件和一个源文件。

③ 在头文件声明动态链接库的导入或者导出以及DLL里面可调用的函数 

 代码解释说明:

  •  #pragma once的作用:用于确保头文件只被编译一次。 
  • 如果在源文件中定义了宏MyDLL_EXPORT,则导出动态链接库,供其它程序调用;如果没有定义MyDLL_EXPORT ,则导入动态链接库,调用动态链接库的函数。此时源文件中未定义宏MyDLL_EXPORT,所以代码的高亮部分是else里面的内容。
  • 在MyDLL中声明一个加法函数add。
  • 在MyDLL中声明一个类MyFun,类里面减法函数substration。注:声明的时候classMyDLL前,否则会报错。

④ 源文件中定义宏以及对应的函数和类

代码解释说明:

  • 定义宏 MyDLL_EXPORT,此时头文件中高亮的是if里面的内容

  • 包含头文件,注:必须先定义宏,再#include头文件
  • int add() 定义一个加法函数
  • int MyFun::subtraction定义类里面的一个减法函数

⑤ 生成动态链接库

(1)右键项目,选择属性

(2)将配置类型改成动态库(.dll),同时可设置动态链接库的输出路径,不设置则输出至默认路径

(3)点击生成解决方案。

3 动态链接库调用步骤

3.1 调用简介

调用动态链接库需要三个文件:

  • ① 头文件(.h
  • .dll
  • .lib
.lib 文件: .lib  文件是动态链接库的导入库文件( import library file )。它包含了函数和变量的声明以及链接信息,但不包含实际的函数代码。当你在代码中调用动态链接库的函数时,编译器会使用  .lib  文件来查找函数的声明和链接信息,以便在程序运行时能够正确地调用动态链接库中的函数。
.dll 文件: .dll  文件是动态链接库的实际二进制文件,它包含了函数的实际代码和数据。在程序运行时,操作系统会动态加载  .dll  文件,并将其中的函数代码映射到程序的地址空间中,以便程序可以调用动态链接库中的函数。

3.2 调用步骤

新建一个“调用”工程 DLLCall ,同时新建一个头文件和源文件。

② 将动态链接库的头文件放到DLLCall工程里。 

③ .dll文件和.lib文件放到.exe的同目录下。比如设置的是Debug+x64,就放在x64/Debug路径下(路径查找可参考博文VS里面执行文件默认存放路径梳理——C++语言-CSDN博客)。

 ④  链接到动态链接库的路径,在附加库目录里添加.dll.lib文件的存放目录

⑤ 附加依赖项里添加.lib文件的名称

 ⑥ 在头文件里#include动态链接库的头文件。

⑦ 测试验证

运行结果如下:

4 其它小技巧

介绍一种动态链接库封装和调用联动小技巧 。上述步骤每次“封装” 工程生成的动态链接库,都需要手动复制到“调用”工程的exe文件的同目录下,为了更加方便地操作,可以将生成动态链接库的输出路径设置成“调用”的exe文件的同目录,这样当“封装”里的头文件不变时,更改代码后,点击一下“封装”里的生成,就可以在“调用”里面运行了,可以大大提高调试效率

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1527457.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件杯 深度学习 python opencv 火焰检测识别 火灾检测

文章目录 0 前言1 基于YOLO的火焰检测与识别2 课题背景3 卷积神经网络3.1 卷积层3.2 池化层3.3 激活函数:3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 YOLOV54.1 网络架构图4.2 输入端4.3 基准网络4.4 Neck网络4.5 Head输出层 5 数据集准备5.1 数…

leetcode 3081

leetcode 3081 题目 例子 思路 使用minheap 记录字符出现频次 代码 class Solution { public:string minimizeStringValue(string s) {int freq[26]{};for(char c: s){if(c ! ?){freq[c-a];}}//std::greater<> 比较器比较 pair 对象时&#xff0c;默认比较规则是先比…

leetcode刷题(javaScript)——动态规划相关场景题总结

动态规划在 JavaScript 刷题中有一定的难度&#xff0c;但也是非常常见和重要的算法思想。动态规划通常适用于需要求解最优解、最大值、最小值等问题的场景&#xff0c;可以将复杂问题拆分成子问题&#xff0c;通过存储子问题的解来避免重复计算&#xff0c;从而提高效率。 理解…

elk收集k8s微服务日志

一、前言 使用filebeat自动发现收集k8s的pod日志&#xff0c;这里分别收集前端的nginx日志&#xff0c;还有后端的服务java日志&#xff0c;所有格式都是用json格式&#xff0c;建议还是需要让开发人员去输出java的日志为json&#xff0c;logstash分割java日志为json格式&#…

Transformer的前世今生 day01(预训练、统计语言模型)

预训练 在相似任务中&#xff0c;由于神经网络模型的浅层是通用的&#xff0c;如下图&#xff1a; 所以当我们的数据集不够大&#xff0c;不能产生性能良好的模型时&#xff0c;可以尝试让模型B在用模型A的浅层基础上&#xff0c;深层的部分自己生成参数&#xff0c;减小数据集…

京津冀自动驾驶产业盛会“2024北京国际自动驾驶技术展览会”

随着科技的飞速发展&#xff0c;自动驾驶技术成为了汽车产业变革的热点和前沿。智能化、网联化已经成为推动汽车产业创新发展的重要力量&#xff0c;而自动驾驶技术则是其中的关键一环。它不仅能够提高道路安全性、缓解交通拥堵&#xff0c;还能为乘客带来更加舒适、便捷的出行…

注册个人小程序

访问地址 https://mp.weixin.qq.com/ 立即注册 选择小程序 注册 填写信息 登录邮箱 访问邮箱的链接激活账号 选择个人&#xff0c;填写信息 注册完成&#xff0c;即可登录进入填写信息

苍穹外卖-day15:套餐管理

套餐管理 课程内容 套餐分页查询启售停售套餐删除套餐新增套餐 1. 套餐分页查询 1.1 需求分析和接口设计 根据产品原型来了解需求&#xff0c;套餐分页查询的产品原型如下&#xff1a; 业务规则&#xff1a; 根据页码展示套餐信息(套餐名称、套餐图片、套餐分类、价格、售…

qt+ffmpeg 实现音视频播放(二)之音频播放

一、音频播放流程 1、打开音频文件 通过 avformat_open_input() 打开媒体文件并分配和初始化 AVFormatContext 结构体。 函数原型如下&#xff1a; int avformat_open_input(AVFormatContext **ps, const char *url, AVInputFormat *fmt, AVDictionary **options); 参数说…

数据分析-Pandas的Andrews曲线可视化解读

数据分析-Pandas的Andrews曲线可视化解读 数据分析和处理中&#xff0c;难免会遇到各种数据&#xff0c;那么数据呈现怎样的规律呢&#xff1f;不管金融数据&#xff0c;风控数据&#xff0c;营销数据等等&#xff0c;莫不如此。如何通过图示展示数据的规律&#xff1f; 数据…

C#,图论与图算法,无向图(Graph)回环(Cycle)的不相交集(disjoint)或并集查找(union find)判别算法与源代码

1 回环(Cycle)的不相交集(disjoint)或并集 不相交集数据结构是一种数据结构,它跟踪划分为多个不相交(非重叠)子集的一组元素。联合查找算法是对此类数据结构执行两个有用操作的算法: 查找:确定特定元素所在的子集。这可用于确定两个元素是否在同一子集中。 并集:将…

Django中使用celery实现异步任务、延时任务、周期定时任务

配置celery 1. 安装以下环境 pip install celery pip install redis pip install eventlet # celery 4.0版本以后不支持在windows运行&#xff0c;还需额外安装eventlet库本文环境为&#xff1a;python3.9.4Django4.2.11celery5.3.6redis5.0.3 2. 配置setting.py文件 在sett…

汽车制造产生的污废水如何处理排放

汽车制造业是一个重要的工业领域&#xff0c;然而&#xff0c;伴随着汽车制造过程中的各种化学反应和材料加工&#xff0c;大量污废水也随之产生。为了保护环境和社会的可持续发展&#xff0c;汽车制造产生的污废水需要得到妥善处理和排放。 首先&#xff0c;针对汽车制造中涉及…

前端vue实现甘特图

1 什么是甘特图 甘特图(Gantt chart)又称为横道图、条状图(Bar chart)。以提出者亨利L甘特先生的名字命名&#xff0c;是项目管理、生产排程、节点管理中非常常见的一个功能。 甘特图内在思想简单&#xff0c;即以图示的方式通过活动列表和时间刻度形象地表示出任何特定项目的…

01.Linked-List-Basic

1. 链表简介 1.1 链表定义 链表&#xff08;Linked List&#xff09;&#xff1a;一种线性表数据结构。它使用一组任意的存储单元&#xff08;可以是连续的&#xff0c;也可以是不连续的&#xff09;&#xff0c;来存储一组具有相同类型的数据。 简单来说&#xff0c;「链表」…

web渗透测试漏洞复现:Elasticsearch未授权漏洞复现

web渗透测试漏洞复现 Elasticsearch未授权漏洞复现Elasticsearch简介Elasticsearch复现Elasticsearch漏洞修复和加固措施 Elasticsearch未授权漏洞复现 Elasticsearch简介 Elasticsearch 是一款 Java 编写的企业级搜索服务&#xff0c;它以分布式多用户能力和全文搜索引擎为特…

功能齐全的免费 IDE Visual Studio 2022 社区版

面向学生、开放源代码和单个开发人员的功能齐全的免费 IDE 下载地址 Visual Studio 2022 社区版 - 下载最新的免费版本 Visual Studio 2022 Community Edition – Download Latest Free Version 准备安装 选择需要安装的程序 安装进行中 使用C学习程序设计相关知识并培养编程…

AI基础知识(3)--神经网络,支持向量机,贝叶斯分类器

1.什么是误差逆传播算法&#xff08;error BackPropagation&#xff0c;简称BP&#xff09;&#xff1f; 是一种神经网络学习算法。BP是一个迭代学习算法&#xff0c;在迭代的每一轮使用广义的感知机学习规则对参数进行更新估计。基于梯度下降&#xff08;gradient descent&am…

安卓RecyclerView简单用法

废话不多说上代码 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"http://schemas.android.com/apk/res-auto"xmlns:tools"http://schem…

LeetCode---388周赛

题目列表 3074. 重新分装苹果 3075. 幸福值最大化的选择方案 3076. 数组中的最短非公共子字符串 3077. K 个不相交子数组的最大能量值 一、重新分装苹果 注意题目中说同一个包裹中的苹果可以分装&#xff0c;那么我们只要关心苹果的总量即可&#xff0c;在根据贪心&#x…