windows系统编程 - 静态库和动态库

文章目录

  • 前言
    • 一、使用obj保护源码
      • 生成obj文件
      • 导入并使用obj文件
        • 方式一 拖入解决方案
        • 方式二 附加依赖项
        • 适配C语言文件
    • 二、静态库的概述
    • 三、静态库的创建与使用
    • 四、动态库的概述
    • 五、动态库的创建
    • 六、动态库的两种调用方式
    • 七、动态链接库的隐式加载
      • __declspec(dllimport) 声明外部函数
      • 使用宏优化导关键字dllimport
      • 动态库的创建优化
      • 动态库的加载优化
    • 八、动态加载库的显示加载
      • LoadLibrary加载DLL
      • FreeLibray卸载DLL
      • GetProcAddress函数
      • 使用
    • 九、Def导出
      • Def语法
        • entryname——导出函数名称 internalname——内部名称
        • ordinal —— 导出函数的序号
        • NONAME——只有序号,没有名字
        • DATA —— 导出变量用的
        • PRIVATE —— 只能显示加载,不能隐式加载
    • 十、DLLMAIN
    • 十一、DLL加载后内存空间
    • 十二、DLL劫持
  • 总结


前言

  • 各位师傅大家好,我是qmx_07,今天讲解静态库和动态库的使用
    在这里插入图片描述

一、使用obj保护源码

  • 程序链接过程:
    在这里插入图片描述
    问题: 如果想让第三方使用 我们设计的程序功能,但是 不想源码构造实现泄露,该怎么办呢?
    答案:通过编译后的obj文件,链接到exe程序使用

生成obj文件

  • Math头文件
    在这里插入图片描述

  • Math.cpp文件
    在这里插入图片描述

  • 运行程序
    在这里插入图片描述

  • 成功生成obj文件

导入并使用obj文件

方式一 拖入解决方案

在这里插入图片描述

  • 将Math.h 函数使用说明 和 Math.obj 编译封装好的函数实现,拖入解决方案,就可以直接使用啦
方式二 附加依赖项

在这里插入图片描述

  • 属性->链接器->输入->附加依赖项,填写obj文件(注意每个obj一行)
适配C语言文件

在这里插入图片描述

  • 可以观察到无法解析外部符号,没办法识别函数,涉及到名称粉碎机制

C语言的名称粉碎是:_Sub,_Add;
C++的名称粉碎是: ?Sub@@YAHHH@Z,?Add@@YAHHH@Z

解决方式: 在obj文件中,设置为C语言的名称粉碎机制,我们也可以使用条件编译,自动识别C语言文件还是CPP文件
在这里插入图片描述

  • 使用上述obj文件,保护源码的方式,需要拷贝大量文件,所以引申出新的概念 - 静态库

二、静态库的概述

  • 函数和数据被编译进一个二进制文件(通常扩展名为.lib)。在使用静态库的情况下,在编译可执行文件时,链接器从库中复制这些函数和数据并把它们和应用程序的其他模块组合起来创建最终的可执行文件(.exe文件)
  • 本质:将大量obj文件打包成lib文件
  • 缺点:
  1. 维护困难:如果.lib更新,使用的工程如需更新,则必须重新编译。
  2. 磁盘冗余:如果很多工程使用,就要拷贝很多份.lib文件,这些lib都是一样的
    无法很好的同时兼容C和C++
  3. 其他语言无法使用

三、静态库的创建与使用

在这里插入图片描述

  • 选择静态库程序
    在这里插入图片描述
  • 取消预编译头
    在这里插入图片描述
  • 点击生成选项,选择生成lib文件
    在这里插入图片描述
    使用静态库和使用 .obj 类似
  1. 添加头文件,使用者才能知道传的什么参数以及其他
  2. 拷贝lib文件和.h头文件到VS工程根目录
  3. 添加lib文件到工程的方式(用法):
    a. 直接拖入项目中
    b. 依赖项添加.lib文件
    c. 代码内添加.lib文件 # pragma comment(lib,lib路径)

在这里插入图片描述

  • 加载lib文件,成功运行
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  • 静态库中还可以定义 变量和类(仅限cpp使用,c语言中 没有类的概念)

四、动态库的概述

动态链接库(DLL) 通常不能直接运行,也不能接收信息,只有在其他模块调用动态链接库中的函数时,才能发挥作用。通常我们把完成某种功能的函数放在一个动态链接库中,提供给其他程序调用。DLL就是整个windows操作系统的基础。动态链接库不能直接运行,也不能接收消息。他们是一些独立的文件

Windows API中所有的函数都包含在DLL中,其中有3个重要的DLL:

  1. Kernel32.dll:包含用于管理内存、进程和线程的函数、例如CreateThread函数。
  2. User32.dll:它包含用于执行用户界面任务(如窗口的创建和消息的传送)的函数。例如CreateWindow函数。
  3. GDI32.dll:它包含用于画图和显示文本的函数
  • 使用动态库的优点:
  1. 可以采用多种编程语言来编写。
  2. 增强产品的功能(扩展插件)
  3. 提供二次开发的平台(扩展插件)
  4. 简化项目管理(一个团队负责自己团队的dll)
  5. 可以节省磁盘空间和内存
  6. 有助于资源的共享
  7. 有助于实现应用程序的本地化

五、动态库的创建

在这里插入图片描述

  • 选择动态链接库程序
    在这里插入图片描述
  • 不使用预编译头
Add.h:
#pragma once
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus__declspec(dllexport) int Add(int x, int y);
#ifdef __cplusplus
}
#endif // __cplusplus
Sub.h
#pragma once
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus__declspec(dllexport) int Sub(int x, int y);
#ifdef __cplusplus
}
#endif // __cplusplus

DLL中导出函数,需要在每一个将要被导出的函数前面添加标识符__declspec(dllexport)

Add.cpp
#include "Add.h"int Add(int x, int y)
{return x + y;
}
#include "Sub.h"int Sub(int x, int y)
{return x - y;
}

编译:生成DLL文件和LIB文件
动态库的LIB文件 与 静态库的LIB文件不同,LIB文件包含该DLL导出的函数和变量的符号名
DLL文件存在实际函数与数据

在这里插入图片描述

  • 使用dependency工具查看导出函数

六、动态库的两种调用方式

隐式加载:
1. 在编译时,程序会将对 DLL 的引用嵌入到可执行文件中。
2. 在程序运行时,操作系统会自动加载并初始化 DLL。
3. 隐式加载不需要手动加载 DLL 或指定 DLL 的路径。
4. 函数调用时,直接使用函数名进行调用,编译器会根据嵌入的引用找到对应的函数地址。
5. DLL 的导入函数表会在程序加载时自动解析,可以直接访问 DLL 中的函数。

显式加载:

  1. 程序需要显式地通过代码来加载 DLL 并获取其函数地址。
  2. 使用 LoadLibrary 函数加载 DLL,并返回一个句柄,表示已加载的 DLL。
  3. 使用 GetProcAddress 函数根据函数名获取 DLL 中的函数地址。
  4. 加载后的 DLL 需要手动卸载,使用 FreeLibrary 函数释放 DLL 句柄。
  5. 函数调用时,需要通过函数指针来调用 DLL 中的函数。

显式加载和隐式加载主要的区别在于加载时机和加载方式。隐式加载在程序运行时自动加载 DLL,并且可以直接调用 DLL 中的函数。而显式加载需要手动加载 DLL,并使用函数指针来调用 DLL 中的函数

七、动态链接库的隐式加载

__declspec(dllimport) 声明外部函数

__declspec(dllimport) 来表明函数是从动态链接库中引入

Add.h
#pragma once
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus__declspec(dllimport) int Add(int x, int y);
#ifdef __cplusplus
}
#endif // __cplusplus
Sub.h
#pragma once
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus__declspec(dllimport) int Add(int x, int y);
#ifdef __cplusplus
}
#endif // __cplusplus

在这里插入图片描述

  • 成功加载使用动态库

使用宏优化导关键字dllimport

  • 创建DLL文件的时候,需要使用dllimport, 使用DLL文件时需要使用dllexport ,需要经常更改 非常麻烦
  • 使用条件编译,进行优化
#pragma once
#ifdef DLL_EXPORT
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif 

代码含义:

  1. #ifdef DLL_EXPORT:这个条件编译指令用于检查是否定义了DLL_EXPORT宏。如果定义了,表示当前是在编译DLL库的源代码,需要导出函数和数据。如果没有定义,则表示当前是在使用DLL的客户端代码,需要导入函数和数据。

  2. #define DLL_API __declspec(dllexport):如果DLL_EXPORT被定义了,那么将DLL_API宏定义为__declspec(dllexport)。__declspec(dllexport)是在Windows平台上用于标记要导出的函数和数据的修饰符。

  3. #else:如果DLL_EXPORT未被定义,执行下面的代码块。

  4. #define DLL_API __declspec(dllimport):将DLL_API宏定义为__declspec(dllimport)。__declspec(dllimport)是在Windows平台上用于标记要导入的函数和数据的修饰符。

动态库的创建优化

在这里插入图片描述

  • 创建DLL_API 根据DLL_EXPORT 选择是导出还是加载
    在这里插入图片描述
  • 预处理器加载DLL_EXPORT
    在这里插入图片描述
    在这里插入图片描述
  • 将导入导出替换成DLL_API,编译DLL文件
    在这里插入图片描述
  • 导出成功

动态库的加载优化

在这里插入图片描述

  • 将common.h文件加载,可以正常运行
  • 补充:在实现动态链接库时,可以不导出整个类,而只导出该类中的某些函数,在导出类的成员函数的时候需要注意,该函数必须具有public类型的访问权限。

八、动态加载库的显示加载

隐式加载并不能满足所有需求;

  • 比如有运行的过程中加载dll的需求。
  • 生成exe的时候并不知道后面可能用到的dll
  • 运行过程中加载dll,运行完之后就卸掉

LoadLibrary加载DLL

在这里插入图片描述

  • LoadLIbraruy 函数 不仅能加载DLL(.dll) ,还可以加载可执行模块(.exe) 一般来说,当加载可执行模块时,主要为了访问该模块内的一些资源,例如对话框资源、位图资源或图标资源等。
  • HMODULE和HINSTANCE类型可以通用,成功加载,返回模块句柄,失败返回NULL

FreeLibray卸载DLL

在这里插入图片描述
参数就是函数句柄 FreeLibrary(hDll);

GetProcAddress函数

在这里插入图片描述

  • 介绍:通过LoadLibrary加载DLL之后,获取导出函数的地址或者导出变量的地址,函数通过函数指针访问,变量通过解引用访问
  • 参数说明: 1.获取DLL的句柄
  • 2.指向常量的字符指针,指定DLL导出的 函数名称,或者序号
  • 返回值:调用成功返回指定导出函数的地址,否则返回NULL

使用

在这里插入图片描述

  • 使用GetProcAddress找到DLL导出的函数地址,需要创建函数指针来承接

九、Def导出

让其他编程语言使用DLL文件,但是其他语言 没有C、CPP的语法,不能使用隐式加载

当混合使用C和C++编程的时候,要使用extern "C"修饰符来导出dll,因为c++的导出会对函数进行名称粉碎后的导出,所以为了保证在开发可执行程序的时候能够找到,所以需要使用同一个编译厂商进行可执行程序的开发。所以我们要用C的约定来进行开发

在这里插入图片描述

  • _stdcall 使用c的名称粉碎
    在这里插入图片描述

  • 给函数名添加下划线前缀和一个特殊的后缀,该后缀由一个@符号后跟作为参数传给函数的字节数组成

  • DEF导出:为了别的编译厂商的编译器在显示链接的时候能够链接到这个DLL,告知编译器不要对导出的函数名进行改编。我们就可以直接使用函数名来调用
    在这里插入图片描述
    在这里插入图片描述

  • 可以观察到,使用c语言的名称粉碎,但是通过def导出名称,函数名没有增加任何修饰

  • 注意: Def导出文件,函数各占一行

Def语法

entryname——导出函数名称 internalname——内部名称

在这里插入图片描述
在这里插入图片描述

  • 函数内部Add 导出外部函数 SuperAdd
    在这里插入图片描述
    意义:函数做更新时候,可以在使用时直接换=后的函数名字,别名不用换
ordinal —— 导出函数的序号

默认从1开始,序号大小是两个字节,也就是极限是FFFF,是65535.

在这里插入图片描述
在这里插入图片描述

  • id对于显示加载很重要,GetProcAddress()第二个参数,实际上动态加载拿到的是函数的地址
  • 使用:通过序号获取函数地址
NONAME——只有序号,没有名字

在这里插入图片描述

DATA —— 导出变量用的

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

PRIVATE —— 只能显示加载,不能隐式加载

在这里插入图片描述

十、DLLMAIN

  • DLL也可以有一个入口函数DllMain(),做初始化,当DLL加载的时候会自动调用。同时他也是一个可选函数,有需求就实现,系统调用,没有需求的话则编译器会自动生成一个空的DllMain函数,啥也没干。DllMain函数是进入动态链接库(DLL)的可选入口点。如果使用了该函数,则在进程和线程初始化和终止时,或者在调用LoadLibrary和FreeLibrary函数时,系统将调用该函数
    在这里插入图片描述
    1.创建动态库
    在这里插入图片描述
Dllmain.cpp
#include <windows.h>__declspec(dllexport) void Foo()
{OutputDebugString("[DLL] Foo");
}BOOL WINAPI	DllMain(_In_ void* _DllHandle,_In_ unsigned long _Reason,_In_opt_ void* _Reserved
)
{switch (_Reason){//不管 DLL_PROCESS_ATTACH 返回值是啥,都会在调用  DllMain  执行  DLL_PROCESS_DETACHcase DLL_PROCESS_ATTACH:{OutputDebugString("[DLL] DLL_PROCESS_ATTACH");break;}case DLL_PROCESS_DETACH:{OutputDebugString("[DLL] DLL_PROCESS_DETACH");break;}default:break;}return TRUE;
}

得到动态链接库文件

显式加载:

#include <iostream>
#include <windows.h>
using namespace std;int main()
{HMODULE  hDll = LoadLibrary(R"(Dllmain.dll)");if (hDll == NULL){cout << "加载失败" << endl;return 0;}FreeLibrary(hDll);cout << "执行成功" << endl;system("pause");return 0;
}

在这里插入图片描述

  • 如果使用隐式加载,返回FALSE,则进程回弹出 应用程序无法正常启动XXX的的错误,并且会在次调用Dllmain并传入标志DlL_PROCESS_DETACH
  • 如果是显示加载,loadlibrary 返回NULL,并且会在次调用Dllmain并传入标志DLL_PROCESS_DETACH

在这里插入图片描述

  • 第一次加载,attach ,第二次加载,没有DLL_PROCESS_ATTACH ;
  • 第一次释放,没有来,第二次释放,DLL_PROCESS_DETACH ;

解释:因为有引用计数,第二次加载的时候不再把相同dll导入,但是计数会+1;再释放的时候,只有计数为0 了,才会走DLL_PROCESS_DETACH 分支!

LoadLibrary 加载库时的引用计数与内核对象有关。

当调用 LoadLibrary 函数加载一个 DLL 时,操作系统会为该 DLL 创建一个内核对象,该对象负责管理该 DLL 的引用计数。每次成功调用 LoadLibrary 函数时,引用计数会递增。而当调用 FreeLibrary 函数卸载 DLL 时,引用计数会递减。只有当引用计数为零时,操作系统才会卸载 DLL 并释放相关资源。

这种引用计数的机制确保了在多个模块或线程使用同一个 DLL 的情况下,DLL 不会被意外卸载。只有当最后一个使用该 DLL 的模块或线程调用 FreeLibrary 时,才会真正卸载 DLL。

需要注意的是,引用计数是在内核对象层级上维护的,因此它是在操作系统内核中进行管理,而不是在用户空间的进程中。这种机制确保了引用计数的准确性和一致性。

十一、DLL加载后内存空间

在这里插入图片描述

  1. dll导出全局变量,两个进程使用,A进程对全局变量修改会不会影响B进程的变量?

A进程修改dll 里面的变量 ,不会影响 B进程 ,因为存在写时拷贝 (A进程 或者 B进程修改一个变量时,系统会为这个变量重新申请一块空间,修改的只是新申请内存里面的值,不会改动原来的内存

  1. 两个进程加载同一个dll,虚拟内存中dll有几份?物理内存中dll有几份?

虚拟内存有2份,物理内存有1份

  1. dll什么时候从物理内存中卸载掉?

AB都不用dll的时候,只要有一个在使用dll,dll就一直在物理内存中加载着

A , B进程加载同一个DLL

  1. DLL进入物理内存(RAM)
  2. DLL映射到A进程和B进程里不同的位置(物理内存占一份,虚拟内存占两份)
  3. DLL内部创建的对象或则全局变量不属于DLL,而是属于进程。
  4. DLL映射到的虚拟内存修改时,进行写实拷贝。

DLL从物理内存卸载的时机:既没有DLL在物理内存的引用计数为0的时候

十二、DLL劫持

在这里插入图片描述

#include <windows.h>#pragma comment(linker, "/EXPORT:?Foo@@YAXXZ=DLL_OLD.?Foo@@YAXXZ")
BOOL WINAPI	DllMain(
_In_ void* _DllHandle,
_In_ unsigned long _Reason,
_In_opt_ void* _Reserved
)
{switch (_Reason){case DLL_PROCESS_ATTACH:{OutputDebugString("[DLL] NewDLL_PROCESS_ATTACH");break;}case DLL_PROCESS_DETACH:{OutputDebugString("[DLL] NewDLL_PROCESS_DETACH");break;}default:break;}return TRUE;
}

在这里插入图片描述
在这里插入图片描述

总结

  • 介绍了静态库和动态库 显示链接、静态链接的使用,Def导出、DLLMAIN函数,以及DLL劫持

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

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

相关文章

数据结构 ——— 查找链式二叉树中值为X的节点

目录 链式二叉树示意图 手搓一个链式二叉树 查找链式二叉树中值为X的节点 链式二叉树示意图 手搓一个链式二叉树 代码演示&#xff1a; // 数据类型 typedef int BTDataType;// 二叉树节点的结构 typedef struct BinaryTreeNode {BTDataType data; //每个节点的数据struc…

基于SSM的BBS社区论坛系统源码

1.项目介绍 系统角色&#xff1a;管理员、业主&#xff08;普通用户&#xff09;功能模块&#xff1a;管理员&#xff08;用户管理、二手置换管理、报修管理、缴费管理、公告管理&#xff09;、普通用户&#xff08;登录注册、二手置换、生活缴费、信息采集、报事报修&#xf…

python的安装环境Miniconda(Conda 命令管理依赖配置)

这一段时间&#xff0c;对AI大模型 有了兴趣就想研究一下。 在研究之前肯定要先把需要的编程技能掌握了。经过我查阅资料&#xff0c;今天就先学一下 python的 环境安装。 Node.js 包管理工具&#xff1a;npm 依赖配置文件&#xff1a;package.json 环境管理&#xff1a;nvm&am…

出租房管理系统有哪些?

出租房管理系统在现代房产租赁市场中发挥着至关重要的作用&#xff0c;其供应商众多&#xff0c;各具特色。以下是对易收租、寓小二、全房通、水滴管家以及悟空租房管理系统等供应商的详细介绍。 一、深圳合众致达科技有限公司的易收租 深圳合众致达科技有限公司是一家专注于…

【在Linux世界中追寻伟大的One Piece】Socket编程TCP

目录 1 -> TCP socket API 2 -> V1 -Echo Server 2.1 -> 测试多个连接的情况 1 -> TCP socket API socket()&#xff1a; socket()打开一个网络通讯端口&#xff0c;如果成功的话&#xff0c;就像open()一样返回一个文件描述符。应用程序可以像读写文件一样用r…

【spring】IOC与DI

&#x1f490;个人主页&#xff1a;初晴~ &#x1f4da;相关专栏&#xff1a;程序猿的春天 一、IOC&#xff08;Inversion of Control&#xff09; 1、概念 IOC&#xff08;Inversion of Control&#xff0c;控制反转&#xff09;是一种设计原则&#xff0c;它将对象的控制权…

【英特尔IA-32架构软件开发者开发手册第3卷:系统编程指南】2001年版翻译,2-16

文件下载与邀请翻译者 学习英特尔开发手册&#xff0c;最好手里这个手册文件。原版是PDF文件。点击下方链接了解下载方法。 讲解下载英特尔开发手册的文章 翻译英特尔开发手册&#xff0c;会是一件耗时费力的工作。如果有愿意和我一起来做这件事的&#xff0c;那么&#xff…

​​​​​​​PHP类型比较

在php中符号分为两种&#xff0c;一种是&#xff0c;还是一种是 松散比较&#xff1a;使用两个等号 比较&#xff0c;只比较值&#xff0c;不比较类型。 严格比较&#xff1a;用三个等号 比较&#xff0c;除了比较值&#xff0c;也比较类型。 注意&#xff0c;当一个号时&…

Mysql、Dm8达梦数据库通过脚本导出指定库所有表的结构详情信息到

目录 前言二、Mysql三、达梦8 前言 在当今复杂多变的数据环境中&#xff0c;数据库作为信息存储与管理的核心&#xff0c;其重要性不言而喻。随着业务的不断拓展和深化&#xff0c;对于数据库表结构的理解与管理成为了确保数据一致性和准确性的关键。特别是在跨数据库系统的场…

yelp数据集上识别潜在的热门商家

yelp数据集是研究B2C业态的一个很好的数据集&#xff0c;要识别潜在的热门商家是一个多维度的分析过程&#xff0c;涉及用户行为、商家特征和社区结构等多个因素。从yelp数据集里我们可以挖掘到下面信息有助于识别热门商家 用户评分和评论分析 评分均值: 商家的平均评分是反映其…

文献阅读记录6-Toward computer-made artificial antibiotics

摘要 将合成生物学和计算生物学的概念结合起来&#xff0c;可能会产生比现有药物更不容易产生耐药性的抗生素&#xff0c;而且还能对抗耐药感染。事实上&#xff0c;计算机引导策略与大规模并行高通量实验方法相结合&#xff0c;代表了抗生素发现的新范式。耐多药微生物引起的…

【docker compose】docker compose的hello world

安装docker desktop后在终端使用以下命令&#xff0c;代表安装成功&#xff0c;并查看当前安装的版本 docker-compose --version示例docker-compose.yml文件 version: 3.8 # 指定 Docker Compose 文件的版本services:scau_jwc: # 定义一个名为 scau_jwc 的服务image: scau_…

PyTorch核心概念:从梯度、计算图到连续性的全面解析(二)

文章目录 pytorch中的Autograd计算图叶子张量 inplace操作PyTorch的两大特点动态图eager execution PyTorch中的Variable参考文献 pytorch中的Autograd pytorch提供了自动求导机制和对GPU的支持 了解自动求导背后的原理和规则&#xff1a;当使用pytorch中没有的loss function时…

dayseven-因果分析-图模型与结构因果模型

在数学上&#xff0c;​“图”(graph)是顶点&#xff08;vertex&#xff0c;也可以称为节点&#xff09;和边(edge)的集合&#xff0c;表示为图G(V,E)&#xff0c;其中V是节点的集合&#xff0c;E是边的集合&#xff0c;图中的节点之间通过边相连&#xff08;也可以不相连&…

今天强的可怕,AI文风写作再也不用写指令了

AI写作最有用的事情之一就是捕捉特定的写作风格&#xff0c;市面上写作工具模仿文风需要下达复杂的prompt&#xff0c;经过一大段精细的微调才能实现&#xff01; 而现在文思助手只要一个按钮就能输出一篇文风相似的文章&#xff01;超级简单&#xff0c;你再也不用为一大段一大…

Vue2中使用firefox的pdfjs进行文件文件流预览

文章目录 1.使用场景2. 使用方式1. npm 包下载,[点击查看](https://www.npmjs.com/package/pdfjs-dist)2. 官网下载1. 放到public文件夹下面2. 官网下载地址[点我,进入官网](https://github.com/mozilla/pdf.js/tags?afterv3.3.122) 3. 代码演示4. 图片预览5. 如果遇到跨域或者…

哪些因素会影响 DC/DC 转换电路快速测试的性能?-纳米软件

DC/DC 转换电路在现代电子设备中起着至关重要的作用&#xff0c;其性能的快速准确测试对于确保电子系统的可靠性和稳定性至关重要。然而&#xff0c;有许多因素会影响 DC/DC 转换电路快速测试的性能。 电路复杂性和参数多样性 单片 DC/DC 转换器由于功能模块和参数复杂性&…

解线性方程组(二)

实验类型&#xff1a;●验证性实验 ○综合性实验 ○设计性实验 实验目的&#xff1a;进一步熟练掌握用Jacobi迭代法和Gauss-Seidel法解线性方程组的算法&#xff0c;提高编程能力和解算线性方程组问题的实践技能。 实验内容&#xff1a; 1)取初值性x(0)(0,0,0,0)T, 精度要求ε…

跨境电商营销:Pinterest的5个便捷营销工具

Pinterest是消费者寻找创意灵感的首选平台之一&#xff0c;同时&#xff0c;根据Global Web Index的调查数据&#xff0c;人们使用Pinterest的首要原因是寻找新产品和品牌&#xff0c;这意味着用户在使用Pinterest时已经有消费意愿和倾向。 因此&#xff0c;让更多目标受众注意…