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

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.mzph.cn/news/754467.shtml

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

相关文章

外贸网站文章批量生成器

随着全球贸易的不断发展,越来越多的企业开始关注外贸市场,而拥有高质量的内容是吸引潜在客户的关键之一。然而,为外贸网站生产大量优质的文章内容可能是一项耗时且繁琐的任务。因此,外贸网站文章批量生成软件成为了解决这一难题的…

remote: GitLab: LFS objects are missing(pre-receive hook declined)

Git push 遇到错误: remote: GitLab: LFS objects are missing. Ensure LFS is properly set up or try a manual "git lfs push --all". To http://192.168.x.x/xxxxxx.git! [remote rejected] dev -> dev (pre-receive hook declined) error: faile…

语音识别:whisper部署服务器(远程访问,语音实时识别文字)

Whisper是OpenAI于2022年发布的一个开源深度学习模型,专门用于语音识别任务。它能够将音频转换成文字,支持多种语言的识别,包括但不限于英语、中文、西班牙语等。Whisper模型的特点是它在多种不同的音频条件下(如不同的背景噪声水…

做跨境用哪种代理IP比较好?怎么选到干净的IP?

代理IP对于做跨境的小伙伴来说,都是必不可少的工具,目前出海的玩法已经是多种多样,开店、账号注册、短视频运营、直播带货、网站SEO等等都是跨境人需要涉及到的业务。而国外代理IP的获取渠道非常多,那么做跨境到底应该用哪种代理I…

linux开机启动设置方法

开机启动最简单的方法是在/etc/rc.local启动脚本中写入需要执行的命令。另一种方式是在/etc/init.d中编写一个启动脚本。但是这两种方式都不是正规的启动模式。init.d是Linux最早的服务管理方案,命令service start xxx就是去调用init.d中的启动脚本。之后init机制被…

蓝桥杯(3.18 刷真题)

P8697 [蓝桥杯 2019 国 C] 最长子序列 AC import java.util.Scanner; public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);String s1 sc.nextLine();String s2 sc.nextLine();char[] c1 s1.toCharArray();char[] c2 s2.toCh…

使用 Redisson 实现分布式 CountDownLatch,如何使用RCountDownLatch实现内外网数据互通的超时控制?

闭锁(CountDownLatch)是一种用于同步多个线程的机制,它可以让一个或多个线程等待其他线程完成某个任务后再继续执行。 在Java中,RCountDownLatch 是 Redisson 提供的分布式闭锁实现,它基于 Redis 的分布式系统&#x…

基于Spring Boot的研究生志愿填报辅助系统

摘 要 二十一世纪我们的社会进入了信息时代,信息管理系统的建立,大大提高了人们信息化水平。传统的管理方式对时间、地点的限制太多,而在线管理系统刚好能满足这些需求,在线管理系统突破了传统管理方式的局限性。于是本文针对这一…

掌握请求控制权:Axios 如何取消请求的两种方法

在前端开发中,网络请求是非常常见的操作。而有时候,我们可能需要在发送请求后取消它,比如用户在请求还未完成时离开了当前页面或者执行了其他操作,本文将介绍如何在使用 Axios 发送请求时取消这些请求。 基本概念 在 Axios 中&am…

【NLP03-新闻主题分类任务】

新闻主题分类任务 背景 以一段新闻报道中的文本描述内容为输入,使用模型帮助我们判断它最优可能属于哪一种类型的新闻,这是典型的文本分类问题,这里假定每种类型是互斥的,即文本描述有且只有一种类型 新闻主题分类数据 #通过t…

swagger使用手册

1.导入依赖 <!--引入swagger--><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.7.0</version></dependency><dependency><groupId>io.springfox</…

什么是集成学习

集成学习是一种机器学习方法&#xff0c;目的是将多个基本学习算法组合起来&#xff0c;以达到更好的预测性能。通过将多个模型的预测结果进行加权平均或投票&#xff0c;集成学习能够减少单个模型的偏差和方差&#xff0c;从而提高整体的泛化能力。常见的集成学习方法包括Bagg…

AR/MR产品设计(二):如何用一双手完成与虚拟对象的自然交互

AR/MR产品设计&#xff08;二&#xff09;&#xff1a;如何用一双手完成与虚拟对象的自然交互 - 知乎 手是我们与现实世界交互最重要的方式&#xff0c;同样在虚实混合的世界中是最重要的交互方式 在AR/MR/VR的交互中&#xff0c;手势交互会作为XR的重要交互动作&#xff0c;因…

鸿蒙开发 一 (一)、框架了解

一、UI框架 开发范式名称 语言生态 UI更新方式 适用场景 适用人群 声明式开发范式 ArkTS语言 数据驱动更新 复杂度较大、团队合作度较高的程序 移动系统应用开发人员、系统应用开发人员 类Web开发范式 JS语言 数据驱动更新 界面较为简单的程序应用和卡片 Web前端…

视频技术1:使用ABLMediaServer推流rtsp

ABLMediaServer定位是高性能、高稳定、开箱即用、商用级别的流媒体服务器 下边展示了如何把1个mp3作为输入源&#xff0c;转换为rtsp流的过程。 作用&#xff1a;用rtsp模拟摄像头的视频流 1、启动ABLMediaServer ABLMediaServer-2024-03-13\WinX64\ABLMediaServer.exe 配…

聚类分析 | Matlab实现基于NNMF+DBO+K-Medoids的数据聚类可视化

聚类分析 | Matlab实现基于NNMFDBOK-Medoids的数据聚类可视化 目录 聚类分析 | Matlab实现基于NNMFDBOK-Medoids的数据聚类可视化效果一览基本介绍程序设计参考资料 效果一览 基本介绍 NNMFDBOK-Medoids聚类&#xff0c;蜣螂优化算法DBO优化K-Medoids 非负矩阵分解&#xff08…

简单来说依赖注入 Unity (c#)

在游戏开发领域,构建引人入胜且组织良好的游戏是最终目标。然而,随着项目复杂性的增加,管理依赖关系和确保代码灵活性可能成为一项艰巨的任务。这就是依赖注入 (DI) 发挥作用的地方。 在本文中,我们将深入 Unity 中的依赖注入世界,探索其概念、优点和实际实现。最后,你将…

代码随想录算法训练营第14天 part02 | 二叉树的递归遍历

递归三要素 确定递归函数的参数和返回值&#xff1a; 确定哪些参数是递归的过程中需要处理的&#xff0c;那么就在递归函数里加上这个参数&#xff0c; 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。 确定终止条件&#xff1a; 写完了递归算法, 运行的时候…

信息学奥赛一本通之MAC端VSCode C++环境配置

前提 安装 Visual Studio CodeVSCode 中安装 C/C扩展确保 Clang 已经安装&#xff08;在终端中输入命令&#xff1a;clang --version 来确认是否安装&#xff09;未安装&#xff0c;在命令行执行xcode-select --install 命令&#xff0c;会自行安装&#xff0c;安装文件有点大…

【Hadoop】解决Hive创建内部表失败:正确配置事务管理器

谁让你我静似月 只能在心里默念 檐下燕替我飞到你身边 谁让你我静似月 各自孤单错弄弦 风吹的帘落见月人不眠 &#x1f3b5; 周笔畅《谁动了我的琴弦》 在使用Apache Hive进行数据处理时&#xff0c;创建内部表是一项常见的操作&#xff0c;它允许用户在H…