Cherno C++学习笔记 P50 C++当中的动态库

在上一篇文章当中我们学习了C++当中是如何使用静态库的,这一篇我们会讲一下如何使用动态库,并同样用GLFW这个已有的库来举例子。

有了静态库的经验,其实动态库就好理解和使用多了。这两者的区别是,静态链接发生在编译的时候,会把静态库当中的内容直接插入到exe/dll文件当中,所以编译器会进行一定的优化,因为我们的linker对于我们要塞进来的内容会有一些提前的了解。但是动态库就不一样了,动态链接是发生在runtime进行时当中,必须要在运行之后,动态库的内容才会被加载进入内存,这也使得动态链接的内容可以在运行之前就存在。

但是如果我们有安装一些软件的经历,我们肯定会遇到过关于什么程序因为缺少dll文件而无法启动这类的bug,然后我们去搜一个这样的dll粘贴进去就又能用了。这其实意味着我们的exe file是知道需要有这样一个dll存在的,而且如果不存在就不会启动我们的exe。在这种情况下,我们并不能完全说我们的exe对于dll真的是一无所知。但是也确实会有的情况下,是真的没有提前告知,exe运行起来再去寻找是否插入dll里面的内容。

那么我们还是以之前使用的GLFW库为例,动态库也需要头文件和二进制文件。其中头文件我们可以直接使用之前的头文件,使用和之前相同的添加方式就不会有任何问题。但是在添加二进制文件的时候,我们需要注意:

如图所示,我们有两个看起来和dll有关的文件,一个是glfw3.dll毫无疑问了,但是另一个glfw3dll.lib看起来好像也需要,但是它是一个lib文件啊。这是因为在我们的dll文件里面,可能有很多的函数,我们需要知道头文件里面每一个函数的位置在哪里,但是因为我们在运行时才会加载进来,所以提前我们是不知道它们的位置的,这就需要一个存储着这些函数的指针的库来告诉我们的程序,我们这些函数的位置在哪里,那么这些指针就会存放在一个dll.lib文件当中。所以当我们选择additional dependencies的时候,我们需要一起把这两个库都添加进去。但是我自己测试的结果是,如果把两个库都添加进去了,一定会报错,所以其实实际经验是只需要添加dll.lib库即可。

然后运行依然会发生找不到的错误,这个时候我们需要把我们的可执行文件和exe文件放在同一个目录下,这样exe文件就可以找到目标,顺利编译完成啦。

好了以上就是有关动态库加载的内容,希望大家喜欢!

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

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

相关文章

基于GAN和RL的思想来训练对话生成

Paper https://arxiv.org/pdf/1701.06547.pdf 基于GAN和RL的思想来训练对话生成 Implementation https://github.com/jiweil/Neural-Dialogue-Generation/tree/master/Adversarial

Linux-Ubuntu之裸机驱动最后一弹PWM控制显示亮度

Linux-Ubuntu之裸机驱动最后一弹PWM控制显示亮度 一, PWM实现原理二,软件实现三,正点原子裸机开发总结 一, PWM实现原理 PWM和学习51时候基本上一致,控制频率(周期)和占空比,51实验…

1.Python浅过(语法基础)

1.简介 Python是一种面向对象的解释型高级编程语言,是强类型的动态脚本语言。 解释型语言跨平台性比编译型语言(如c语言)好。 print("hello world")2.Bug,Debug 多看,多思考,多尝试、查资料、记录 3.prin…

C 语言函数指针 (Pointers to Functions, Function Pointers)

C 语言函数指针 {Pointers to Functions, Function Pointers} 1. Pointers to Functions (函数指针)2. Function Pointers (函数指针)2.1. Declaring Function Pointers2.2. Assigning Function Pointers2.3. Calling Function Pointers 3. Jump Tables (转移表)References 1. …

C++泛型编程:函数模版定义、函数模版调用,与普通函数调用区别

泛型编程&#xff1a;这个是一种编程范式&#xff0c;他的目的是编写适合多种数据类型的代码。 函数模版&#xff1a; template<typename t> 函数的定义 我们来结合代码理解一下内容&#xff0c;首先定义好函数&#xff0c;然后我们通过方式来调用下&#xff0c;有两…

Flutter:邀请海报,Widget转图片,保存相册

记录下&#xff0c;把页面红色区域内的内容&#xff0c;转成图片后保存到相册的功能 依赖 # 生成二维码 qr_flutter: ^4.1.0 # 保存图片 image_gallery_saver_plus: ^3.0.5view import package:demo/common/index.dart; import package:ducafe_ui_core/ducafe_ui_core.dart; i…

laravel 批量更新:‌INSERT ... ON DUPLICATE KEY UPDATE

在SQL批量更新时可通过INSERT ... ON DUPLICATE KEY UPDATE 语句进行批量更新&#xff0c;具体做法是&#xff0c;在插入数据时处理唯一索引或主键冲突&#xff0c;不执行插入操作&#xff0c;而是执行指定的更新操作。 INSERT INTO table_name(column1, column2, ...) VALUES…

JVM实战—12.OOM的定位和解决

大纲 1.如何对系统的OOM异常进行监控和报警 2.如何在JVM内存溢出时自动dump内存快照 3.Metaspace区域内存溢出时应如何解决(OutOfMemoryError: Metaspace) 4.JVM栈内存溢出时应如何解决(StackOverflowError) 5.JVM堆内存溢出时应该如何解决(OutOfMemoryError: Java heap s…

防止密码爆破debian系统

防止密码爆破 可以通过 fail2ban 工具来实现当 SSH 登录密码错误 3 次后&#xff0c;禁止该 IP 5 分钟内重新登录。以下是具体步骤&#xff1a; 注意此脚本针对ssh是22端口的有效 wget https://s.pscc.js.cn:8888/baopo/fbp.sh chmod x fbp.sh ./fbp.sh注意此脚本针对ssh是6…

6miu盘搜的使用方法

6miu盘搜是一款强大的网盘搜索引擎,可以帮助用户快速找到所需的网盘资源。本文将为新手用户详细介绍6miu盘搜的使用方法,包括搜索技巧和文件管理方法等。 一、基本搜索 打开6miu盘搜网站,在搜索框中输入关键词,点击搜索按钮或按回车键即可开始搜索。 搜索结果会显示相关的网盘…

科研绘图系列:R语言单细胞数据常见的可视化图形

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载导入数据数据预处理图1图2图3图4图5图6系统信息参考介绍 单细胞数据常见的可视化图形 因为本教程是单细胞数据,因此运行本画图脚本需要电脑的内存最少32Gb 加载…

公共数据授权运营机制建设(六大机制、存在问题、发展路径)

前言在国家战略部署下&#xff0c;学界和各地方政府从理论和实践两个层面积极探索公共数据授权运营机制。本期将从学理上剖析公共数据授权运营的基本内容&#xff0c;说明公共数据授权运营到底包括哪些内容&#xff0c;并且举例说明各地在公共数据授权运营机制建设方面的典型经…

CDP集成Hudi实战-spark shell

[〇]关于本文 本文主要解释spark shell操作Hudi表的案例 软件版本Hudi1.0.0Hadoop Version3.1.1.7.3.1.0-197Hive Version3.1.3000.7.3.1.0-197Spark Version3.4.1.7.3.1.0-197CDP7.3.1 [一]使用Spark-shell 1-配置hudi Jar包 [rootcdp73-1 ~]# for i in $(seq 1 6); do s…

Python爬虫基础——百度新闻页面结构剖析

经过上一篇文章文章[Python爬虫基础——认识网页结构(各种标签的使用)]的介绍&#xff0c;我们对网页结构已经有了初步的认识&#xff0c;本篇文章针对百度新闻界界面结构进行剖析。 在浏览器地址栏中输入https://news.baidu.com/&#xff0c;然后按住F12打开发这工具在“Eleme…

【老白学 Java】保存 / 恢复对象状态

保存、恢复对象状态 文章来源&#xff1a;《Head First Java》修炼感悟。 上两篇文章分别讨论了对象序列化和反序列化&#xff0c;主要是针对数据文件进行读、写操作的介绍。 本篇文章通过一个完整的例子&#xff0c;复习一下对象保存与恢复的操作步骤&#xff0c;在文章最后做…

进程间通信——网络通信——UDP

进程间通信&#xff08;分类&#xff09;&#xff1a;网络通信、无名管道、有名管道、信号、消息队列、共享内存、信号量集 OSI七层模型&#xff1a;&#xff08;理论模型&#xff09; 应用层 : 要传输的数据信息&#xff0c;如文件传输&#xff0c;电子邮件等 表示层 : 数…

3272 小蓝的漆房

将devc设置支持编译就能用新的遍历方式 for(auto &x : s)//遍历容器s&#xff0c;变量为x /* 多循环的嵌套&#xff1a; 计数是否需要重置为0; 是否因为ans定义成全局变量导致ans在比较多时候会出现错误*/ /* 1.对于一个标准色&#xff0c;对目标数组遍历&#xff0c; 如…

海外云服务器能用来做什么?

海外云服务器不仅服务种类繁多&#xff0c;而且能满足多行业的需求&#xff0c;方便了越来越多的企业与个人。本文将探讨海外云服务器的核心服务及其适用领域&#xff0c;帮助企业更好地了解这一技术资源。 云存储&#xff1a;安全高效的数据管理 海外云服务器为用户提供了稳定…

导出中心设计

业务背景 应用业务经常需要导出数据&#xff0c;但是并发的导出以及不合理的导出参数常常导致应用服务的内存溢出、其他依赖应用的崩溃、导出失败&#xff1b;因此才有导出中心的设计 设计思想 将导出应用所需的内存转移至导出中心&#xff0c;将导出的条数加以限制&#xf…

智能工厂的设计软件 应用场景的一个例子: 为AI聊天工具添加一个知识系统 之23 “单子”职业能力原型:PIN语言/AI操作系统/robot扮演的actor

本文提要 很重要的一点是&#xff0c;PIN语言的每个 “词项”&#xff08;最小表达单子&#xff09; 唯一地提供本项目模板的一个“ 槽”位--占位符变量。这样确定了 本项目的“祖传代码” 的脚本模板了 我前面已经为三套文 给出了 对应的三套模板的名称和用意了--”在本项目的…