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.hqwc.cn/news/539710.html

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

相关文章

活动图高阶讲解-03

1 00:00:00,000 --> 00:00:06,260 刚才我们讲了活动图的历史 2 00:00:06,260 --> 00:00:11,460 那我们来看这个活动图 3 00:00:11,460 --> 00:00:15,260 如果用来建模的话怎么用 4 00:00:15,260 --> 00:00:20,100 按照我们前面讲的软件方法的工作流 5 00:00:20…

2023版IDEA永久破解教程带patch.exe破解程序

2023版IDEA永久破解教程带patch.exe破解程序 第零步:百度云盘获取程序第一步:关闭电脑的病毒和危险防护(目的是避免电脑自动清除破解程序)1.找到电脑的 病毒和威胁防护2.蓝色按钮表示防护处于开启状态3.关闭成功会展示“实时保护已…

npm、nodejs和vue之间关系和区别介绍

本文讲解npm、Node.js和Vue.js这三者之间的关系和区别,以及它们各自的特点。 首先,让我们来了解一下Node.js。 **Node.js** 是一个开源的服务器端运行环境,它允许开发者使用JavaScript来编写服务器端的代码。在传统的Web开发中&#…

直方图及数据95%置信区间及特征筛选

rm(list ls()) library(Rmisc) library(ggplot2) library(dplyr)data <- iris x<-iris$Sepal.Length #求置信区间方法1## confidence_interval <- t.test(x)$conf.int print(confidence_interval) #[1] 5.709732 5.976934 #attr(,"conf.level") #[1] 0.95#…

算法---滑动窗口练习-4(无重复字符的最长子串)

无重复字符的最长子串 1. 题目解析2. 讲解算法原理3. 编写代码 1. 题目解析 题目地址&#xff1a;点这里 2. 讲解算法原理 算法的主要思想是使用滑动窗口来维护一个不含重复字符的子串。定义两个指针 left 和 right 分别表示窗口的左边界和右边界。还定义了一个数组 hash 来记…

#QT(一种朴素的计算器实现方法)

1.IDE&#xff1a;QTCreator 2.实验&#xff1a;这是全靠自己想法写的计算器&#xff0c;没有参考任何教程。 &#xff08;1&#xff09;这个计算器只要有运算符敲入就会进行一次运算&#xff0c;所以他没有先后之后&#xff0c;无法满足运算优先级。 &#xff08;2&#xff…

code摘录日记[矩阵变元素,变列向量,3D表面图,table行列设置] Matlab

矩阵变元素&#xff0c;变列向量 W1(Z1 < Z2) nan; % Z1,Z2 all matrix,Only plot points where Z1 > Z2;Z1 < Z2位置值填为NaNx x(:); % Now x is a 30-by-1 vector; matrix变列vector技巧3D表面图 hand figure; % Handle to the figure, for more plotting later…

XUbuntu22.04之关闭todesk开机自启动(二百二十一)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

C语言-strcmp(对比函数模拟和使用)

strcmp&#xff08;对比函数模拟和使用&#xff09; strcmp的语法 字符串的比较目的 这里比如你写一个网站&#xff0c;对照自己的用户和密码进行对比 使用(对比)方式 strcmp&#xff08;arr1&#xff0c;arr2&#xff09; 常量 arr1这里是常量 数组名是个地址所以是拷贝 …

QT网络编程之实现UDP广播发送和接收

推荐一个不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;内容全面&#xff0c;作为入门科普和学习提升都不错&#xff0c;分享一下给大家&#xff1a;前言https://www.captainbed.cn/ai 一.UDP通信 1.QT中实现UDP通信主要用到了以下类&#xff1a;QUdpSocket、QHost…

Spring Boot 集成 WebSocket 实例 | 前端持续打印远程日志文件更新内容(模拟 tail 命令)

这个是我在 CSDN 的第一百篇原则博文&#xff0c;留念&#x1f60e; #1 需求说明 先说下项目结构&#xff0c;后端基于 Spring Boot 3&#xff0c;前端为 node.js 开发的控制台程序。现在希望能够在前端模拟 tail 命令&#xff0c;持续输出后端的日志文件。 #2 技术方案 #2.…

Ansible自动化运维Inventory与Ad-Hoc

前言 自动化运维是指利用自动化工具和技术来简化、自动化和优化IT基础设施的管理和运维过程&#xff0c;从而提高效率、降低成本&#xff0c;并减少人为错误。在当今复杂的IT环境中&#xff0c;自动化运维已经成为许多组织和企业提高生产力和保证系统稳定性的重要手段。Ansibl…