Windows平台用vistual studio 2017打包制作C++动态库
1. 创建库项目
- 打开 Visual Studio 2017,选择 文件 → 新建 → 项目。
- 选择 Visual C++ → Windows 桌面 → 动态链接库 (DLL) 或 静态库 (LIB)。
- 动态库 (DLL):生成
.dll
和.lib
(导出符号表)。 - 静态库 (LIB):生成
.lib
(直接包含代码)。
- 动态库 (DLL):生成
- 输入项目名称(如
MyLibrary
),点击 确定。
2. 编写类代码
2.1示例:动态库 (DLL)
-
添加头文件(
MyClass.h
):#pragma once// 导出宏定义 #ifdef MYLIBRARY_EXPORTS #define MYLIBRARY_API __declspec(dllexport) #else #define MYLIBRARY_API __declspec(dllimport) #endifclass MYLIBRARY_API MyClass { public:MyClass();int Add(int a, int b); };
-
添加源文件(
MyClass.cpp
):#include "MyClass.h"MyClass::MyClass() {}int MyClass::Add(int a, int b) {return a + b; }
2.2示例:静态库 (LIB)
-
静态库不需要导出宏(直接包含完整代码):
// MyClass.h #pragma onceclass MyClass { public:MyClass();int Add(int a, int b); };
3. 配置项目属性
- 设置导出符号(仅动态库需要):
- 右键项目 → 属性 → C/C++ → 预处理器 → 预处理器定义。
- 添加
MYLIBRARY_EXPORTS
(确保动态库项目导出符号)。
- 调整输出目录(可选):
- 右键项目 → 属性 → 常规 → 输出目录,设置为
$(SolutionDir)bin\$(Platform)\$(Configuration)\
。
- 右键项目 → 属性 → 常规 → 输出目录,设置为
- 确保生成目标类型:
- 检查 配置类型(属性 → 常规 → 配置类型)应为
动态库 (.dll)
或静态库 (.lib)
。
- 检查 配置类型(属性 → 常规 → 配置类型)应为
4. 编译生成库
- 选择 生成 → 生成解决方案(或按
F7
)。 - 生成的库文件会在输出目录中:
- 动态库:
MyLibrary.dll
和MyLibrary.lib
。 - 静态库:
MyLibrary.lib
。
- 动态库:
5. 使用库
5.1在另一个项目中调用动态库
-
包含头文件:
#include "MyClass.h"
-
链接库文件:
- 右键项目 → 属性 → 链接器 → 输入 → 附加依赖项,添加
MyLibrary.lib
。 - 在 链接器 → 常规 → 附加库目录 中指定
.lib
文件路径。
- 右键项目 → 属性 → 链接器 → 输入 → 附加依赖项,添加
-
将
.dll
文件放在可执行文件目录:- 将
MyLibrary.dll
复制到可执行文件(.exe
)的同一目录。
- 将
-
调用代码示例:
#include "MyClass.h" #include <iostream>int main() {MyClass obj;std::cout << "Add: " << obj.Add(3, 5) << std::endl;return 0; }
6. 常见问题
- 符号未导出:确保在动态库项目中定义了
MYLIBRARY_EXPORTS
。 - 链接错误:检查
.lib
文件路径是否正确。 - 缺少
.dll
:确保.dll
文件在可执行文件目录或系统路径中。 - 平台不匹配:确保生成库的平台(x86/x64)与调用项目一致。
7.静态库 vs 动态库
类型 | 特点 |
---|---|
静态库 | 代码直接编译到可执行文件中,无需额外依赖。 |
动态库 | 运行时加载,减少可执行文件体积,支持模块化更新。 |
8.设置debug模式生成的*_d.dll和*_d.lib
在 Visual Studio 中,可以通过配置项目属性来区分 Debug 和 Release 模式生成的库文件名(例如 MyLibrary_d.dll
和 MyLibrary_d.lib
)。以下是具体步骤:
8.1修改输出文件名(添加 _d
后缀)
(1) 针对 Debug 配置
-
右键项目 → 属性 → 确保顶部配置为 Debug 和对应的平台(如 x64)。
-
进入 常规 → 目标文件名:
- 默认值为
$(ProjectName)
。 - 修改为
$(ProjectName)_d
,这样生成的库文件会带_d
后缀。
- 默认值为
(2) 针对 Release 配置
- 切换顶部配置为 Release。
- 确保 目标文件名 为
$(ProjectName)
(无后缀)。
8.2调整输出目录(可选)
为了区分 Debug 和 Release 的输出文件,可以设置不同的输出目录:
-
在 常规 → 输出目录 中,修改为:
- Debug:
$(SolutionDir)bin\$(Platform)\Debug\
- Release:
$(SolutionDir)bin\$(Platform)\Release\
- Debug:
8.3链接器导入库名称(自动同步)
- 无需手动修改:当修改 目标文件名 后,链接器生成的
.lib
文件名会自动同步(例如MyLibrary_d.lib
)。
8.4验证生成结果
编译项目后,检查输出目录:
- Debug 模式:生成
MyLibrary_d.dll
和MyLibrary_d.lib
。 - Release 模式:生成
MyLibrary.dll
和MyLibrary.lib
。
8.5调用方项目配置
如果其他项目要链接该库,需根据配置引用对应的文件:
- Debug 配置:
- 附加依赖项:
MyLibrary_d.lib
- 库目录:
$(SolutionDir)bin\$(Platform)\Debug\
- 附加依赖项:
- Release 配置:
- 附加依赖项:
MyLibrary.lib
- 库目录:
$(SolutionDir)bin\$(Platform)\Release\
- 附加依赖项:
8.6完整配置示例
(1) 项目属性(Debug)
配置项 | 值 |
---|---|
目标文件名 | $(ProjectName)_d |
输出目录 | $(SolutionDir)bin\$(Platform)\Debug\ |
运行时库 | MDd (多线程调试 DLL) |
(2) 项目属性(Release)
配置项 | 值 |
---|---|
目标文件名 | $(ProjectName) |
输出目录 | $(SolutionDir)bin\$(Platform)\Release\ |
运行时库 | MD (多线程 DLL) |
8.7自动化配置(使用宏)
若需更灵活的命名规则,可以通过编辑 .vcxproj
文件自定义生成逻辑:
<!-- 在 .vcxproj 文件中添加条件 -->
<PropertyGroup Condition="'$(Configuration)' == 'Debug'"><TargetName>$(ProjectName)_d</TargetName>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)' == 'Release'"><TargetName>$(ProjectName)</TargetName>
</PropertyGroup>
运行 HTML
8.8注意事项
- 运行时库一致性:
- Debug 和 Release 配置的 代码生成 → 运行时库 必须与调用方项目一致(如
MDd
或MTd
)。
- Debug 和 Release 配置的 代码生成 → 运行时库 必须与调用方项目一致(如
- 清理旧文件:
- 修改配置后,先清理解决方案(生成 → 清理解决方案),再重新生成。
- 符号导出宏:
- 如果导出宏(如
JIEBASEGMENTER_API
)依赖项目名称,确保名称修改不影响宏定义。
- 如果导出宏(如
9.隐藏第三方库头文件
很多时候我们制作一个功能类,如果调用第三方库在头文件中有引用,那么在其他人调用的时候也要将第三方库链接到项目中。当第三方库比较多的时候,这样就比较麻烦。我们如何能将第三方库头文件完全隐藏在生成的二进制库文件中呢?下面让我们详细说明一下。
原来的类:
9.1 隐藏前的头文件
// MyLibrary.h
#pragma once
#include <third/third_lib.h> // 引用 OpenCV 头文件#ifdef MYLIBRARY_EXPORTS
#define MYLIBRARY_API __declspec(dllexport)
#else
#define MYLIBRARY_API __declspec(dllimport)
#endifclass MYLIBRARY_API MyLibrary {
public:// 构造函数MyLibrary(const std::string& str);// 成员函数声明std::vector<std::string> getWords(const std::string& sentence);// ......private:ThirdLib* thirdLib;
};
9.2 隐藏前的源码文件
// MyLibrary.cpp
MyLibrary::MyLibrary(const std::string& str):
thirdLib(std::make_unique<ThirdLib>(str))
{// 逻辑
}std::vector<std::string> MyLibrary::getWords(const std::string& sentence)
{// 逻辑
}
9.3 隐藏后的头文件
// MyLibrary.h
#pragma once#ifdef MYLIBRARY_EXPORTS
#define MYLIBRARY_API __declspec(dllexport)
#else
#define MYLIBRARY_API __declspec(dllimport)
#endif// 前向声明实现类(完全隐藏 third)
class ThirdLibImpl;class MYLIBRARY_API MyLibrary {
public:// 构造函数MyLibrary(const std::string& str);// 析构函数~MyLibrary();// 禁用拷贝(避免浅拷贝问题)MyLibrary(const MyLibrary&) = delete;MyLibrary& operator=(const MyLibrary&) = delete;// 移动语义支持(可选)MyLibrary(MyLibrary&&) noexcept;MyLibrary& operator=(MyLibrary&&) noexcept;// 成员函数声明std::vector<std::string> MyLibrary::getWords(const std::string& sentence);// ......private:std::unique_ptr<ThirdLibImpl> thirdLibImpl;
};
9.4 隐藏后的源码文件
// MyLibrary.cpp
#include "pch.h"
#include "MyLibrary.h"//--------------------- 实现类定义(完全隐藏) ---------------------
class ThirdLibImpl{
public:ThirdLibImpl(const std::string& str) {// 逻辑}std::vector<std::string> getWords(const std::string& sentence){// 逻辑}
private:ThirdLib* thirdLib; // 实际持有的 cppjieba 实例
};//--------------------- 接口类实现 ---------------------
MyLibrary::MyLibrary(const std::string& str) : thirdLibImpl(std::make_unique<ThirdLib>(str)) {}MyLibrary::~MyLibrary() = default;// 移动构造函数
MyLibrary::MyLibrary(MyLibrary&& other) noexcept: thirdLibImpl(std::move(other.thirdLibImpl)) {}// 移动赋值运算符
MyLibrary& MyLibrary::operator=(MyLibrary&& other) noexcept {if (this != &other) {pimpl_ = std::move(other.thirdLibImpl);}return *this;
}// 成员函数转发到实现类
std::vector<std::string> MyLibrary::getWords(const std::string& sentence)
{return thirdLibImpl->getWords(sentence);
}
相关文章:
Windows平台用vistual studio 2017打包制作C++动态库
1. 创建库项目 打开 Visual Studio 2017,选择 文件 → 新建 → 项目。选择 Visual C → Windows 桌面 → 动态链接库 (DLL) 或 静态库 (LIB)。 动态库 (DLL):生成 .dll 和 .lib(导出符号表)。静态库 (LIB):生成 .lib&…...
QT日历控件重写美化
效果图 先放一个效果图以供大家参考,大家可以根据自己需要的效果来调整自己的控件,日历控件实现了自定义日历选择框,设置了表头颜色,设置日历当天重要事件提醒功能。 设置表头样式 setVerticalHeaderFormat(QCalendarWidget::NoV…...
单细胞分析读取处理大型数十万细胞的数据集的优化
单细胞分析读取处理大型数十万细胞的数据集的优化 背景简介 有朋友反映用自己的笔记本电脑在分析比较大的单细胞数据集的时候,比如细胞数量有十万个以上甚至几十万个的时候,可能自己的电脑的内存32G或64G都不够用,一般来说,做生…...
HTTP 3.0 协议的特点
HTTP/3 是互联网传输协议的一次重要升级,相较于 HTTP/2,它引入了多项显著改进和新特性。 基于 QUIC 协议: HTTP/3 采用了 QUIC(Quick UDP Internet Connections)作为底层传输协议,QUIC 基于 UDP࿰…...
电子电器架构 --- 下一代汽车电子/电气(E/E)架构
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 周末洗了一个澡,换了一身衣服,出了门却不知道去哪儿,不知道去找谁&am…...
08软件测试需求分析案例-删除用户
删除用户是后台管理菜单的一个功能模块,只有admin才有删除用户的权限。不可删除admin。 1.1 通读文档 通读需求规格说明书是提取信息,提出问题,输出具有逻辑、规则、流程的业务步骤。 信息:此功能应为用户提供确认删除的功能。…...
await 在多线程,子线程中的使用
await 在多线程,子线程中的使用 await self.send_reply(user, user, user, auto_content, reply) 这行代码是在一个异步函数里调用类的实例方法 send_reply 代码含义 1. await 关键字 在 Python 的异步编程里,await 关键字的作用是暂停当前异步函数的执行,直到 await 后…...
NLP高频面试题(四十六)——Transformer 架构中的位置编码及其演化详解
引言 Transformer 模型(Vaswani 等人,2017)在序列建模中取得了革命性突破,利用自注意力机制实现了并行的序列处理。然而,Transformer 本身对序列的顺序信息不敏感:输入序列元素在自注意力中是无排列的(Permutation-invariant)。换言之,Transformer 缺乏像 RNN 那样的…...
C++笔记-list
list即是我们之前学的链表,这篇主要还是讲解list的底层实现,前面会讲一些list区别于前面string和vector的一些接口以及它们的注意事项。 一.list的基本使用 和之前的string,vector一样,有很多之前见过的一些接口,经过…...
机器学习 | 细说Deep Q-Network(DQN)
文章目录 📚传统Q学习的局限性📚DQN介绍🐇核心思想🐇关键技术🐇DQN的工作流程⭐️流程分步讲解🔄 整体流程循环小结 🐇DQN的局限性及改进方向 👀参考视频&博客 什么是 DQN (Rein…...
【SpringBoot+Vue自学笔记】003 SpringBoot Controll
跟着这位老师学习的:https://www.bilibili.com/video/BV1nV4y1s7ZN?vd_sourceaf46ae3e8740f44ad87ced5536fc1a45 这段话的意思其实是:Spring Boot 简化了传统 Web 项目的搭建流程,让你少折腾配置,直接开搞业务逻辑。 ὒ…...
Sentinel源码—4.FlowSlot实现流控的原理一
大纲 1.FlowSlot根据流控规则对请求进行限流 2.FlowSlot实现流控规则的快速失败效果的原理 3.FlowSlot实现流控规则中排队等待效果的原理 4.FlowSlot实现流控规则中Warm Up效果的原理 1.FlowSlot根据流控规则对请求进行限流 (1)流控规则FlowRule的配置Demo (2)注册流控监…...
跟康师傅学Java-基础语法
跟康师傅学Java-基础SE 一、Java语言概述 1. 基本概念 什么是Java?干什么的? 前端是服务员,java做后台的,服务器,好比餐馆的厨师! Java之父:詹姆斯.高斯林(James Gosling) 软件:一系列按照特定顺序组织的计算机数据和指令的集合。分为系统软件和应用软件。 程序…...
Java语言实现递归调用算法
1. 递归调用原理 递归是一种编程技巧,其中函数直接或间接地调用自身。递归的核心思想是将一个复杂问题分解为更小的子问题,直到问题变得足够简单可以直接解决。递归通常包含两个部分: 1. 基础情况(Base Case)ÿ…...
【数据结构_10】二叉树(1)
一、树 树是一种非线性的数据结构,是由n个有限节点组成一个具有层次关系的集合。树的每个节点能够延伸出多个子节点,但每个子节点只能由一个父节点。 树形结构中,子树之间不能有交集,否则就不是树形结构。 二、树的表示形式 1…...
c++:智能指针
1.智能指针使用场景与优势 void Func() { int* array1 new int[10]; int* array2 new int[10]; try { int len, time; cin >> len >> time; cout << Divide(len, time) << endl; } catch (...) { cout << "delete []" << arr…...
RISC-V简介
RISC-V简介 1. RISC-V RISC-V(发音为“riskfive”)是一个基于精简指令集(RISC)原则的全新开源指令集架构(ISA)。其中的字母“V”包含两层意思,一是这是Berkeley从RISCI开始设计的第五代指令集…...
Google Test 与 Google Mock:C++ 测试与模拟的完美结合
Google Test 与 Google Mock:C 测试与模拟的完美结合 摘要 本文深入解析 Google Test(GTest)和 Google Mock(GMock)的核心功能与使用方法,探讨两者在 C 项目中的联合应用及集成策略。通过详细的功能介绍、…...
c语言数据结构----------二叉排序树
#include <stdio.h> #include <malloc.h>//定义二叉排序树 typedef struct BSTnode {int key; //节点值int keyNull; //便于地址传递struct BSTnode *lchild;struct BSTnode *rchild; } BSTnode;//往二叉排序树插入结点 int BSTInsert(BSTnode *T, int k) {if (…...
Sysstat学习
Sysstat(System Statistics)是一个功能强大的开源工具集,用于监控 Linux 系统的性能和资源使用情况,特别适用于 Ubuntu 系统。它包含多个工具,如 sar、iostat、mpstat 和 pidstat,帮助系统管理员实时或历史…...
智能体开发范式革命:Cangjie Magic的颠覆性创新与行业重塑
开篇:一场静悄悄的技术革命 2025年春季,人工智能领域发生了一场意义深远却鲜为人知的变革。仓颉社区推出的Cangjie Magic智能体开发平台,正以润物细无声的方式重塑着AI应用的构建范式。这并非简单的工具迭代,而是一次从底层逻辑到顶层设计的全面革新。本文将带领读者深入探…...
k8s 下 java 服务出现 OOM 后获取 dump 文件
文章目录 背景解决第 1 步:通过 Dockerfile 挂载 NFS 盘第 2 步:修改 dump 路径为 NFS 盘路径第 3 步:OOM dump 验证参考背景 😂 背景:项目部署在RainBond(k8s)环境下,容器出现 OOM 异常后,k8s 会自动进行滚动更新。 恰恰因为滚动更新,会导致原来的容器被删除。这…...
16位海明码解码电路设计教程
## 1. 海明码基本原理 ### 1.1 什么是海明码 海明码(Hamming Code)是一种能够检测并纠正单比特错误的纠错码,由理查德海明(Richard Hamming)于1950年发明。它通过添加几个校验位(奇偶校验位)到原始数据中,使得数据在传输过程中发生单比特错误时能够被检测…...
九、数据库day01--认识
文章目录 一、认识数据库1.数据库分类关系型数据库核⼼要素示例 2. SQL 语⾔3. MySQL 数据库介绍4. 数据库连接⼯具 Navicat连接数据库操作步骤 总结 提示:以下是本篇文章正文内容,下面案例可供参考 一、认识数据库 说明: 数据库是专⻔⽤来存储数据的软…...
2.深入剖析 Rust+Axum 类型安全路由系统
摘要 详细解读 RustAxum 路由系统的关键设计原理,涵盖基于 Rust 类型系统的路由匹配机制、动态路径参数与正则表达式验证以及嵌套路由与模块化组织等多种特性。 一、引言 在现代 Web 开发中,路由系统是构建 Web 应用的核心组件之一,它负责…...
深度学习 从入门到精通 day_02
1. 自动微分 自动微分模块torch.autograd负责自动计算张量操作的梯度,具有自动求导功能。自动微分模块是构成神经网络训练的必要模块,可以实现网络权重参数的更新,使得反向传播算法的实现变得简单而高效。 1.1 基础概念 1. 张量 :…...
Selenium 实现自动化分页处理与信息提取
Selenium 实现自动化分页处理与信息提取 在 Web 自动化测试或数据抓取场景中,分页处理是一个常见的需求。通过 Selenium,我们可以实现对多页面内容的自动遍历,并从中提取所需的信息。本文将详细介绍如何利用 Selenium 进行自动化分页处理和信…...
【系统搭建】DPDK实现两虚拟机基于testpmd和l2fwd的收发包
testpmd与l2fwd的配合构建一个高性能的虚拟网络测试环境。l2fwd服务工作在数据链路层,使用MAC地址寻址,很多基于DPDK的策略实现可以基于l2fwd进行开发。 一、拓扑结构示意 ------------------- 虚拟化层网络 ------------------- | 虚拟机1 …...
简单接口工具(ApiCraft-Web)
ApiCraft-Web 项目介绍 ApiCraft-Web 是一个轻量级的 API 测试工具,提供了简洁直观的界面,帮助开发者快速测试和调试 HTTP 接口。 功能特点 支持多种 HTTP 请求方法(GET、POST、PUT、DELETE)可配置请求参数(Query …...
C语言数据类型取值范围
32位C语言整型数据类型取值范围 64位C语言整型数据类型取值范围 C语言标准数据类型保证的取值范围 在编写程序时如果要方便移植,我们应该关注的是图2-11的取值范围。 摘录自《CSAPP》。...
【机器学习】大数据时代,模型训练慢如牛?解锁Spark MLlib与分布式策略
Langchain系列文章目录 01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...
合成数据赋能AI:从生成到闭环的全景图谱
目录 合成数据赋能AI:从生成到闭环的全景图谱 🎯 项目目标 📄 白皮书 / PPT 大纲结构 一、合成数据概述(What & Why) 二、合成数据的核心生成技术(How) 三、合成数据适配任务…...
CS144 Lab0实战记录:搭建网络编程基础
文章目录 1 实验概述与背景2 ByteStream的设计与实现2.1 字节流抽象概述2.2 实现思路2.3 核心数据结构2.4 Writer实现细节2.5 Reader实现细节 3 WebGet应用实现 1 实验概述与背景 Stanford大学的CS144课程是计算机网络领域最著名的课程之一,其实验设计巧妙地引导学…...
杂记-LeetCode中部分题思路详解与笔记-HOT100篇-其三
时光荏苒啊,没想到这么快就到了四月份... 这个坑好久没写了,现在我们重启一下。 我看了一下之前的笔记,似乎是停留在了链表部分且HOT100中可以说最重要的链表题之一:LRU缓存居然没有写,真是岂有此理,让我…...
【python画图】:从入门到精通绘制完美柱状图
目录 Python数据可视化:从入门到精通绘制完美柱状图一、基础篇:快速绘制柱状图1.1 使用Matplotlib基础绘制1.2 使用Pandas快速绘图 二、进阶篇:专业级柱状图定制2.1 多系列柱状图2.2 堆叠柱状图2.3 水平柱状图 三、专业参数速查表Matplotlib …...
医疗设备预测性维护的合规性挑战与标准化路径研究
摘要 本研究从医疗设备全生命周期管理视角,探讨预测性维护技术面临的特殊合规性挑战及其标准化解决方案。通过分析全球12个主要医疗市场的监管差异,提出基于ISO 23510的通用合规框架,并验证其在三类典型医疗设备(生命支持类、影像…...
使用 XWPFDocument 生成表格时固定列宽度
一、XWPFDocument XWPFTable个性化属性 1.初始默认写法 XWPFTable table document.createTable(n, m); //在文档中创建一个n行m列的表格 table.setWidth("100%"); // 表格占页面100%宽度// 通过getRow获取行进行自定义设置 XWPFTableRow row table.getRow(0); XW…...
抽象的https原理简介
前言 小明和小美是一对好朋友,他们分隔两地,平时经常写信沟通,但是偶然被小明发现他回给小美的信好像被人拆开看过,甚至偷偷被篡改过。 对称加密算法 开头的通信过程比较像HTTP服务器与客户端的通信过程,全明文传输…...
Chakra UI框架中响应式断点
默认的断点:base是默认样式,不带任何媒体查询,适用于所有屏幕。 sm是30em(约480px) md是48em(768px) lg是62em(992px) xl是80em(1280px) 2xl是96e…...
【cocos creator 3.x】cocos creator2.x项目升级3.x项目改动点
1、基本改动 基本改动:去掉了cc.,改成在顶部添加导入 项目升级时候直接将cc.去掉,根据提示添加引用 node只保留position,scale,rotation,layer 其余属性如opacity,如果需要使用需要在节点手动添加UIOpacity组件 3d层和ui层分开…...
【android telecom 框架分析 01】【基本介绍 2】【BluetoothPhoneService为何没有源码实现】
1. 背景 我们会在很多资料上看到 BluetoothPhoneService 类,但是我们在实际 aosp 中确找不到具体的实现, 这是为何? 这是一个很好的问题!虽然在车载蓝牙电话场景中我们经常提到类似 BluetoothPhoneService 的概念,但…...
Linux:进程:进程调度
进程在CPU上运行具有以下特性: 竞争、独⽴、并⾏、并发 竞争性:系统进程数⽬众多,⽽CPU资源很少甚至只有一个,所以进程之间是具有竞争属性的。为 了⾼效完成任务,更合理竞争相关资源,便具有了优先级 独⽴性: 为了避…...
2025年探秘特种设备安全管理 A 证:守护安全的关键凭证
在现代工业与生活中,特种设备如锅炉、压力容器、电梯、起重机械等广泛应用,它们给我们带来便利的同时,也伴随着较高的安全风险。为了确保这些设备的安全运行,保障人民生命财产安全,特种设备安全管理显得尤为重要&#…...
WebSocket 实现数据实时推送原理
WebSocket 实现数据实时推送的核心机制在于其全双工通信能力和持久的连接特性。以下是其工作原理的详细步骤: 1. 握手阶段(HTTP 升级协议) 客户端发起请求:通过发送一个带有特殊头部的 HTTP 请求,请求协议升级。 GET …...
快速迭代收缩-阈值算法(FISTA)
文章目录 1. 数学与优化基础2. FISTA 算法的原理、推导与机制3. Matlab 实现4. FISTA 在图像处理与压缩感知中的应用4.1. 基于小波稀疏先验的图像去噪4.2 压缩感知图像重建 1. 数学与优化基础 在许多信号处理与机器学习问题中,我们希望获得稀疏解,即解向…...
XC6SLX100T-2FGG484I 赛灵思 XilinxFPGA Spartan-6
XC6SLX100T-2FGG484I 是Xilinx 推出的Spartan-6 LXT 系列FPGA芯片,采用45nm工艺设计,以高性价比和低功耗为核心 系列定位:Spartan‑6 LXT,中端逻辑与 DSP 加速 逻辑资源:101 261 个逻辑单元(LE࿰…...
DP 32bit位宽数据扰码实现和仿真
关于DisplayPort 1.4协议中扰码用的16-bit LFSR的移位8个时钟周期后的输出表达式我们已经用迭代的方法推导过,那么移位32个时钟周期的输出表达式同样可以迭代32次推导出,或者将移位8个时钟的输出表达式迭代3次也可以得到。以下就是移位32个时钟周期的输出…...
Electricity Market Optimization 探索系列(V)
本文参考链接link \hspace{1.6em} 众所周知, 社会福利是指消费者剩余和生产者剩余的和,也等价于产品的市值减去产品的成本,在电力市场中也非常关注社会福利这一概念,基于电力商品的同质性的特点,我们引入反价格需求函数来形象地刻…...
vue3 element-plus el-time-picker控制只显示时 分,并且控制可选的开始结束时间
只显示时分 控制只显示时分 HH:mm 控制只显示时分秒 HH:mm:ss 全部代码: <template><el-time-pickerstyle"width: 220px !important;"v-model"timeValue"format"HH:mm"value-format"HH:mm"/> </template&…...
从技术本质到未来演进:全方位解读Web的过去、现在与未来
一、Web的本质定义 Web(万维网)是一种基于**超文本传输协议(HTTP)和统一资源标识符(URI)**构建的分布式信息系统。它的核心在于通过超链接将全球范围内的信息资源连接成网状结构,使任何接入互联网的设备都能访问这些资源。Web的本质特征体现在三个方面: 跨平台性:无论…...