当前位置: 首页 > news >正文

你真的懂动态库吗?一文详解动态库的方方面

这里写目录标题

  • 创建动态库
  • 创建静态库
  • 动态库与静态库的区别
  • 动态链接与静态链接的区别
  • 动态库的加载过程
    • dll的创建以及应用程序隐式链接到dll的过程
    • dll的创建以及应用程序显示链接到dll的过程
  • 动态库的二进制兼容性

创建动态库

1.【新建】-》【项目】-》【动态链接库】
在这里插入图片描述
新建的动态库结构如下:
在这里插入图片描述
新建项目:MathLibrary.h

// MathLibrary.h - Contains declarations of math functions
#pragma once#ifdef MATHLIBRARY_EXPORTS
#define MATHLIBRARY_API __declspec(dllexport)
#else
#define MATHLIBRARY_API __declspec(dllimport)
#endif// The Fibonacci recurrence relation describes a sequence F
// where F(n) is { n = 0, a
//               { n = 1, b
//               { n > 1, F(n-2) + F(n-1)
// for some initial integral values a and b.
// If the sequence is initialized F(0) = 1, F(1) = 1,
// then this relation produces the well-known Fibonacci
// sequence: 1, 1, 2, 3, 5, 8, 13, 21, 34, ...// Initialize a Fibonacci relation sequence
// such that F(0) = a, F(1) = b.
// This function must be called before any other function.
extern "C" MATHLIBRARY_API void fibonacci_init(const unsigned long long a, const unsigned long long b);// Produce the next value in the sequence.
// Returns true on success and updates current value and index;
// false on overflow, leaves current value and index unchanged.
extern "C" MATHLIBRARY_API bool fibonacci_next();// Get the current value in the sequence.
extern "C" MATHLIBRARY_API unsigned long long fibonacci_current();// Get the position of the current value in the sequence.
extern "C" MATHLIBRARY_API unsigned fibonacci_index();

注意头文件中的预定义宏:

#ifdef MATHLIBRARY_EXPORTS
#define MATHLIBRARY_API __declspec(dllexport)
#else
#define MATHLIBRARY_API __declspec(dllimport)
#endif

在动态库设置预定义宏,
在这里插入图片描述
添加项目,MathLibrary.cpp

// MathLibrary.cpp : Defines the exported functions for the DLL.
#include "pch.h" // use stdafx.h in Visual Studio 2017 and earlier
#include <utility>
#include <limits.h>
#include "MathLibrary.h"// DLL internal state variables:
static unsigned long long previous_;  // Previous value, if any
static unsigned long long current_;   // Current sequence value
static unsigned index_;               // Current seq. position// Initialize a Fibonacci relation sequence
// such that F(0) = a, F(1) = b.
// This function must be called before any other function.
void fibonacci_init(const unsigned long long a,const unsigned long long b)
{index_ = 0;current_ = a;previous_ = b; // see special case when initialized
}// Produce the next value in the sequence.
// Returns true on success, false on overflow.
bool fibonacci_next()
{// check to see if we'd overflow result or positionif ((ULLONG_MAX - previous_ < current_) ||(UINT_MAX == index_)){return false;}// Special case when index == 0, just return b valueif (index_ > 0){// otherwise, calculate next sequence valueprevious_ += current_;}std::swap(current_, previous_);++index_;return true;
}// Get the current value in the sequence.
unsigned long long fibonacci_current()
{return current_;
}// Get the current index position in the sequence.
unsigned fibonacci_index()
{return index_;
}

相关文献:
演练:创建和使用自己的动态链接库 (C++)

创建静态库

具体参见《演练:创建并使用静态库》,这里不再详述。

动态库与静态库的区别

名称不同:
静态库:.lib
动态库:
.dll

链接方式不同:
静态库采用静态链接方式,在程序链接阶段,静态库与汇编生成的目标文件一起打包到程序可执行文件*.exe中。
静态库对函数库的链接是在编译阶段完成的,运行时与函数库没有关系了。
所有的目标文件和函数库都会链接到程序可执行文件中,比较浪费空间和资源。

动态库在编译时并不会被链接到目标代码中,而是在程序运行的时候才被载入。
动态链接方式==》动态链接又包括显示链接和隐士链接。

多个程序引用
当一个静态库A被多个程序使用时,每个程序都会有A的一个拷贝,比较浪费空间。
不同程序使用相同的动态库,动态库在内存中只有一份实例,可以实现进程之间资源共享。==》动态库也叫做共享库。

程序更新:
如果静态库更新了,所有使用它的程序都需要重新编译。

注意:
静态库的lib和动态库的lib不是一个概念,
静态库的lib叫做静态库,动态库里面的lib叫做导入库。
静态库lib包含实际执行代码和符号表等;导入库,实际执行代码在动态库中,导入库只包含了地址符号表等。

相关文献:
C++静态库与动态库

动态链接与静态链接的区别

相关文献
深入浅出静态链接和动态链接

动态库的加载过程

dll的创建以及应用程序隐式链接到dll的过程

  1. 头文件中,包含导出函数的原型、结构和符号的说明
  2. c/c++源文件,其中包含待导出函数的实现和变量
  3. 编译器为每个源文件生成.obj文件
  4. 链接器将为每个obj模块合并,生成dll
  5. 如果至少导出一个函数或变量,链接器同时生成lib文件
    构建exe
  6. 头文件,包含导出函数的原型、结构和符号的声明
  7. 源文件,包含待导出函数的实现和变量
  8. 编译器为每个源文件生成obj文件
  9. 链接器将每个obj模块合并,并使用lib文件来解析导入的函数/变量的引用,从而生成exe。(它包含一个导入表,其中列出了必需的dll和导入的符号)
    运行应用程序
    加载程序创建地址空间
    加载程序将必需的dll载入到地址空间
    进程的主线程开始执行,应用程序开始执行

dll的创建以及应用程序显示链接到dll的过程

  • 头文件中,包含导出函数的原型、结构和符号的说明
  • c/c++源文件,其中包含待导出函数的实现和变量
  • 编译器为每个源文件生成.obj文件
  • 链接器将为每个obj模块合并,生成dll
  • 如果至少导出一个函数或变量,链接器同时生成lib文件(显示链接没有用到这个lib文件)
    构建exe
  • 头文件,包含导出函数的原型、结构和符号的声明
  • 源文件,包含待导出函数的实现和变量
  • 编译器为每个源文件生成obj文件
  • 链接器将每个obj模块合并,从而生成exe。(由于没有直接引用dll的导入符号,因此这里不需要它的lib文件,生成的exe不包含导入表)
    运行应用程序
  • 加载程序创建地址空间 进程的主线程开始执行,应用程序开始执行
  • 线程调用loadLiberay来将dll载入到进程的地址空间中。
  • 各个线程可以调用GetProAddress来简接地引用dll导出的符号。

动态库的二进制兼容性

相关文章:

你真的懂动态库吗?一文详解动态库的方方面

这里写目录标题创建动态库创建静态库动态库与静态库的区别动态链接与静态链接的区别动态库的加载过程dll的创建以及应用程序隐式链接到dll的过程dll的创建以及应用程序显示链接到dll的过程动态库的二进制兼容性创建动态库 1.【新建】-》【项目】-》【动态链接库】 新建的动态…...

I.MX6ULL内核开发12:使用设备树插件实现RGB灯驱动

目录 一、引言 二、设备树插件格式 三、实验说明 四、实验准备 4.1 通过内核工具编译设备树插件 五、实验效果 5.1 uboot加载 5.2 加载RGB驱动 一、引言 Linux4.4以后引入了动态设备树&#xff08;Dynamic DevicesTree&#xff09;&#xff0c;这里翻译位“设备树插件…...

大家一起来找茬,新手第一次layout到底能挑出多少毛病?

有一个新手工程师在论坛上发了一篇帖子&#xff0c;把自己的处女PCB布线图贴出来。 如果不看其他网友的评论&#xff0c;你能看出多少问题呢&#xff1f;可以在留言区和我们互动哦~ 帖子里他还提出了自己的小见解&#xff1a;问一下&#xff0c;我觉得自动布线挺好用的啊&#…...

Java集合概述(Collection集合)

目录集合一、集合与数组二、集合类体系结构三、泛型(约定集合存储数据类型)四、Collection集合常用API五、Collection集合的遍历方式5.1 迭代器遍历5.2 增强for循环(for each):5.3 lambda表达式六、Collection集合存储自定义类型的对象七、常见数据结构集合 一、集合与数组 数…...

运动无线蓝牙耳机哪款好、运动无线蓝牙耳机推荐

作为 运动爱好者&#xff0c;每天早晨醒来后的第一件事就去家门口的湿地公园跑上一圈。各种运动装备都齐了&#xff0c;不过在耳机选择上还真的犯难&#xff0c;打着“运动耳机”旗号的产品也是种类繁多&#xff0c;那么到底什么样的无线耳机更适合运动呢&#xff1f;于是我花时…...

解决AAC音频编码时间戳的计算问题

1.主题音频是流式数据&#xff0c;并不像视频一样有P帧和B帧的概念。就像砌墙一样&#xff0c;咔咔往上摞就行了。一般来说&#xff0c;AAC编码中生成文件这一步&#xff0c;如果使用的是OutputStream流写入文件的话&#xff0c;就完全不需要计算时间。但在音视频同步或者使用A…...

Android 9.0 添加自定义开机广播

1.概述 在9.0的系统rom定制化开发中,由于系统开机广播接收受限,普通app接收不到这个广播,如果接收这个广播很多应用 感觉要好久收到这个广播, 所以需要自定义开机广播来使用自定义广播开启某些应用,实现自己的功能,接下来就需要分析下开机广播的流程,然后增加自定义广播…...

第四阶段10-添加类别,类别列表mapper层,service层,controller层

63. 添加类别–Mapper层 插入类别数据的功能此前已经完成&#xff01; 64. 添加类别–Service层 在项目的根包下创建pojo.dto.CategoryAddNewDTO类&#xff1a; Data public class CategoryAddNewDTO implements Serializable {/*** 类别名称*/private String name;/*** 父…...

linux内核启动分析(一)

文章目录1.HEAD1.preserve_boot_args1.1 __inval_dcache_area2.el2_setup3. set_cpu_boot_mode_flag4. __create_page_tables4.1map_memory5. __cpu_setup6. __primary_switch6.1 __enable_mmu6.2 __primary_switched最近工作中经常使用飞腾E2000的开发版&#xff0c;也遇到一些…...

wireshark常见使用操作讲解以及几个故障解决案例分享

&#xff08;1&#xff09;网卡选择 对于电脑本身有多个网卡的时候&#xff0c;选择网卡就成为了一个困惑的地方&#xff0c;其实这里很简单&#xff0c;只要把鼠标放在对应的网卡上面就可以看到地址等信息&#xff0c;就容易判断出来了。 &#xff08;2&#xff09;过滤器 直…...

利用逻辑分析仪解析串口通讯数据

利用逻辑分析仪解析串口通讯数据&#x1f527;采用的是市面上最为广泛使用的USB逻辑分析仪: &#x1f4da;资料下载&#xff1a; 链接: https://pan.baidu.com/s/1c9lwWDbtJxaJED-kzSbiJg 提取码: 5vnr&#x1f528;测试工具为&#xff1a;Logic 2.4.6&#xff0c;也可以使用Pu…...

新整理的前端面试题

pinia和vuex的区别&#xff08;1&#xff09;pinia它没有mutation,他只有state&#xff0c;getters&#xff0c;action【同步、异步】使用他来修改state数据&#xff08;2&#xff09;pinia他默认也是存入内存中&#xff0c;如果需要使用本地存储&#xff0c;在配置上比vuex麻烦…...

数据仓库-数仓分层

层级 全拼 职责划分 ODS(源数据层) Operational DataStore ODS层存储最原始的数据&#xff0c; 对数据不做任何加工处理&#xff1b; 源数据主要来自业务数据库和日志&#xff0c;这些数据是用户操作业务系统产生&#xff0c;所以叫操作型数据(Operational Data) 。 DWD(…...

【Linux】Linux根文件系统扩容

场景&#xff1a;根文件系统需要至少100GB的剩余空间&#xff0c;但是目前就剩余91GB。因此&#xff0c;我们需要对根文件系统进行扩容。# df -h 文件系统 容量 已用 可用 已用% 挂载点 devtmpfs 3.9G 0 3.9G 0% /dev tmpfs …...

RPC编程:Hessian RPC一个老的RPC框架(一)

RPC编程&#xff1a;Hessian RPC一个老的RPC框架一&#xff1a;Hessian RPC1&#xff1a;Hession RPC一个老的RPC框架2&#xff1a;老&#xff0c;为什么还要研究&#xff1f;3&#xff1a;Hession RPC概念二&#xff1a;Hessian RPC设计思想1&#xff1a;Hession依赖于服务器2…...

逆向 x蜂窝 zzzghostsigh

逆向 x蜂窝 zzzghostsigh 版本 9.3.7 新版本是64位的so charles 抓包 目标字段 zzzghostsigh frida java function hook_xPreAuthencode() {Java.perform(function() {var helper Java.use("com.mfw.tnative.AuthorizeHelper");helper.xPreAuthencode.implemen…...

QML 鼠标事件

作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 QML 中有一些元素本身是不具备交互能力的(例如:Rectangle、Text、Image 等),那么如何通过鼠标来控制它们的行为呢?这里就需要用到 MouseArea 元素了,它继承于 Item 且不可见,通常需要与可见元素结合使…...

极智项目 | 实战pytorch arcface人脸识别

欢迎关注我的公众号 [极智视界]&#xff0c;获取我的更多经验分享 大家好&#xff0c;我是极智视界&#xff0c;本文介绍 实战pytorch arcface人脸识别&#xff0c;并提供完整项目源码。 本文介绍的实战arcface人脸识别项目&#xff0c;提供完整的可以一键训练、测试的项目工程…...

【IP技术】ipv4和ipv6是什么?

IPv4和IPv6是两种互联网协议&#xff0c;用于在互联网上标识和寻址设备。IPv4&#xff08;Internet Protocol version 4&#xff09;是互联网协议的第四个版本&#xff0c;是当前广泛使用的互联网协议。IPv4地址由32位二进制数构成&#xff0c;通常表示为4个十进制数&#xff0…...

linux基本功系列之uniq命令实战

文章目录前言一. uniq的命令介绍二. 语法格式及常用选项三. 参考案例3.1 统计行数3.2 对文本进行去重3.3 显示不重复的行3.4 仅显示重复的行&#xff0c;且显示重复的行的所有行3.5 忽略字母大小写总结前言 大家好&#xff0c;又见面了&#xff0c;我是沐风晓月&#xff0c;本…...

Phi-4-Reasoning-Vision智能助手:医疗影像图文问答系统构建实践

Phi-4-Reasoning-Vision智能助手&#xff1a;医疗影像图文问答系统构建实践 1. 项目概述 Phi-4-Reasoning-Vision是一款基于微软Phi-4-reasoning-vision-15B多模态大模型开发的高性能推理工具&#xff0c;专为医疗影像分析场景优化。该系统能够理解医学影像内容并回答专业问题…...

gte-base-zh场景应用:电商搜索与客服问答的语义匹配实战

gte-base-zh场景应用&#xff1a;电商搜索与客服问答的语义匹配实战 1. 电商场景中的语义匹配挑战 1.1 搜索不精准的痛点分析 在电商平台上&#xff0c;用户搜索"苹果手机"却看到水果苹果的图片&#xff0c;或者输入"轻薄笔记本"却返回游戏本&#xff0…...

STM32HAL库项目实战:我把W5500和MQTTClient库‘缝’起来,实现了阿里云OTA升级前传

STM32HAL库与W5500深度整合&#xff1a;从MQTT云连接到OTA升级的工程实践 在嵌入式设备智能化浪潮中&#xff0c;远程固件升级(OTA)已成为工业设备的标配功能。本文将揭示如何基于STM32HAL库和W5500以太网芯片构建可靠的云连接通道&#xff0c;为后续OTA升级打下坚实基础。不同…...

LeagueAkari:基于LCU API的英雄联盟自动化工具集架构设计与实战应用

LeagueAkari&#xff1a;基于LCU API的英雄联盟自动化工具集架构设计与实战应用 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit L…...

英雄联盟智能工具League Akari:提升游戏体验的终极指南

英雄联盟智能工具League Akari&#xff1a;提升游戏体验的终极指南 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit League Akari是…...

基于STM32与ADC的锂电池电量监测系统设计

1. 锂电池电量监测为什么需要STM32和ADC&#xff1f; 做嵌入式开发的朋友应该都遇到过这样的需求&#xff1a;设备用锂电池供电&#xff0c;需要实时显示剩余电量。比如手持设备、智能家居控制器或者无人机&#xff0c;电量显示都是刚需功能。但锂电池的特性决定了直接测量电量…...

taocms v3.0.2漏洞防御指南:如何避免.htaccess文件被恶意利用

Taocms v3.0.2安全加固实战&#xff1a;从漏洞原理到防御体系构建 当网站管理后台的.htaccess文件成为攻击者的跳板时&#xff0c;系统安全便形同虚设。近期曝光的Taocms v3.0.2远程代码执行漏洞&#xff08;CVE-2022-25578&#xff09;正是利用了这一薄弱环节&#xff0c;攻击…...

告别低效苦读!研一新生文献阅读全流程AI工具选择指南(6款工具实战对比)

研一开学第一个月&#xff0c;导师丢来20篇英文文献让你"先看看"。你打开第一篇Nature子刊&#xff0c;密密麻麻的专业术语让你头皮发麻。用翻译软件逐句翻译&#xff1f;格式全乱了&#xff0c;图表公式看不懂。硬着头皮啃原文&#xff1f;一个下午只看完3页&#x…...

MelonLoader终极指南:3分钟掌握Unity游戏模组加载器完整使用技巧

MelonLoader终极指南&#xff1a;3分钟掌握Unity游戏模组加载器完整使用技巧 【免费下载链接】MelonLoader The Worlds First Universal Mod Loader for Unity Games compatible with both Il2Cpp and Mono 项目地址: https://gitcode.com/gh_mirrors/me/MelonLoader Me…...

原子操作的实现原理

在并发编程、操作系统与计算机体系结构中&#xff0c;原子操作是保证数据安全、避免竞态条件的基石。它的核心特性是不可中断、不可分割&#xff0c;操作要么完整执行&#xff0c;要么完全不执行&#xff0c;绝不会出现中间状态。本文将从定义出发&#xff0c;逐层拆解原子操作…...