C++ 创建和配置dll与lib库
C++简明教程(13)创建和配置dll与lib库_怎样生成lib库和dll库-CSDN博客
C++ 动态库与静态库详解
一、为什么要引入库的概念
在 C++ 编程中,随着项目规模的不断扩大,代码量也会急剧增加。如果将所有代码都写在一个源文件中,会导致代码难以维护、可读性差且编译时间过长。库的出现解决了这些问题,它具有以下重要意义:
- 代码复用:可以将一些常用的功能封装成库,例如数学运算函数、文件操作函数等,在多个不同的项目中重复使用这些库代码,避免了重复开发,大大提高了开发效率。
- 模块化:将代码分成不同的模块(库),每个模块专注于特定的功能,使得代码结构更加清晰。不同的开发人员可以同时开发不同的库模块,加快项目的整体进度,并且便于后期的维护和升级。
- 保密:对于一些商业软件或者不想公开源代码的项目,库可以将代码进行封装,只提供对外的接口(头文件),隐藏了内部的实现细节,保护了知识产权。
二、库的分类
C++ 中的库主要分为静态库和动态库:
- 静态库(Static Library):英文名称为“Static Library”,后缀在 Windows 下通常是 .lib,在 Linux 下是 .a。静态库在编译时会被链接到可执行文件中,成为可执行文件的一部分,所以最终生成的可执行文件体积相对较大,但好处是可执行文件在运行时不依赖于外部的库文件,具有更好的独立性和移植性,因为它自身已经包含了所需的所有代码。
- 动态库(Dynamic Library):英文名称为“Dynamic Library”,在 Windows 下后缀是 .dll(Dynamic Link Library),在 Linux 下是 .so(Shared Object)。动态库在程序运行时才被加载和链接,可执行文件在运行时需要找到相应的动态库才能正常工作。这使得可执行文件体积较小,但依赖于动态库的存在。动态库的优点是多个程序可以共享同一个动态库的代码,节省内存空间,而且更新动态库时,不需要重新编译所有依赖它的可执行文件,只要接口不变,只需要替换动态库文件即可。
三、库项目的代码写法
无论是静态库还是动态库项目,通常不需要 main
函数,因为它们不是独立运行的程序,而是被其他程序调用的代码集合。主要工作是将函数和类导出供外部使用。
- 在 Windows 下,对于要导出的函数和类,需要使用
__declspec(dllexport)
关键字(注意前面是两个下划线)。例如:
__declspec(dllexport) int add(int a, int b) {return a + b;
}
这里将 add
函数导出,以便其他程序可以调用。同时,为了保证函数名在 C 和 C++ 中的兼容性(因为 C++ 会对函数名进行修饰,而 C 不会),通常会结合 extern "C"
使用,如下:
extern "C" __declspec(dllexport) int add(int a, int b) {return a + b;
}
extern "C"
的作用是告诉编译器按照 C 语言的函数命名规则来处理函数名,避免 C++ 的函数名修饰,这样在其他语言(如 C)调用这个动态库中的函数时也能正确找到函数入口。
- 在头文件中,需要声明这些导出的函数和类,并且对于使用动态库的项目,头文件的声明也需要一些特殊处理。例如:
#ifndef MATH_FUNCTIONS_H
#define MATH_FUNCTIONS_H#ifdef BUILDING_DLL
# define DLL_EXPORT __declspec(dllexport)
#else
# define DLL_EXPORT __declspec(dllimport)
#endifextern "C" DLL_EXPORT int add(int a, int b);#endif
这里通过 BUILDING_DLL 这个预定义宏来区分是在构建动态库还是使用动态库。当构建动态库时,使用 __declspec(dllexport) 导出函数;当使用动态库时,使用 __declspec(dllimport) 导入函数,这样可以提高程序的运行效率(虽然在很多情况下不写 __declspec(dllimport) 也能正常工作,但明确写出是一种更好的编程习惯)。
四、动态库相关问题
- 为什么使用动态库依然会生成.lib 文件(在 Windows 下):在 Windows 环境中,生成的 .lib 文件是动态库的导入库(Import Library)。当我们链接一个动态库时,链接器需要知道动态库中函数和变量的符号信息,以便在程序运行时能够正确地加载和链接动态库。这个导入库就包含了这些符号信息,它在链接阶段被使用,而真正的代码实现在 .dll 文件中,在程序运行时才被加载。
五、库的使用配置
- 静态库的配置:
- 首先需要获取静态库的头文件(.h)和库文件(.lib)。
- 在项目中,将头文件复制到项目目录下,并在源文件中使用 #include 指令包含头文件。
- 在编译器的链接选项中,指定要链接的静态库文件。例如在 Visual Studio 中,在项目属性的“链接器 - 输入 - 附加依赖项”中添加静态库文件名(如 mylib.lib);在 Linux 下使用 g++ 编译时,使用 -L 选项指定库文件所在目录,-l 选项指定库文件名(如 g++ main.cpp -L. -lmylib -o main,这里 -L. 表示在当前目录下查找库文件,-lmylib 表示链接 libmylib.a 库,main.cpp 是使用库的源文件,main 是生成的可执行文件名)。
- 动态库的导入:
- 同样需要头文件来获取函数和类的声明信息。
- 在 Windows 下,除了头文件,还需要导入库(.lib)文件和动态库(.dll)文件。导入库用于链接阶段,而 .dll 文件需要在程序运行时能够被找到,可以将 .dll 文件复制到可执行文件所在目录或者系统的动态库搜索路径中。
- 在 Linux 下,通常只需要头文件和动态库(.so)文件,在链接时使用 -L 和 -l 选项指定库文件,并且在运行时,需要确保动态库文件在系统的库搜索路径中(可以通过设置 LD_LIBRARY_PATH 环境变量来临时添加搜索路径,例如 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/dll,但这种方式在终端关闭后失效,更好的方法是将动态库安装到系统的标准库目录或者在 /etc/ld.so.conf 文件中添加库文件所在目录,并运行 ldconfig 命令更新库缓存)。
- 如果没有 .lib 库(在 Windows 下),也可以使用 Windows 的 API 函数 LoadLibrary 和 GetProcAddress 来在运行时动态加载动态库并获取函数指针,从而调用动态库中的函数,但这种方式相对复杂,不建议初学者使用,除非有特殊需求。例如:
#include <windows.h>
#include <iostream>typedef int (*ADD_FUNC)(int, int);int main() {// 加载动态库HINSTANCE hDll = LoadLibrary("mydll.dll");if (hDll!= NULL) {// 获取函数地址ADD_FUNC addFunction = (ADD_FUNC)GetProcAddress(hDll, "add");if (addFunction!= NULL) {int result = addFunction(3, 5);std::cout << "加法结果:" << result << std::endl;} else {std::cout << "无法获取函数地址" << std::endl;}// 释放动态库FreeLibrary(hDll);} else {std::cout << "无法加载动态库" << std::endl;}return 0;
}
六、什么是 pdb 文件及如何使用
- PDB 文件(Program Database File):它是在 Windows 平台上用于调试的文件,包含了程序的调试信息,例如变量名、函数名、行号、类型信息等。当在 Visual Studio 等开发环境中进行调试时,如果有对应的 .pdb 文件,调试器可以显示更详细准确的调试信息,如变量的当前值、函数的调用栈等,帮助开发者更容易地找出程序中的错误。
- 如何使用:在 Visual Studio 中,默认情况下,当编译项目时,如果是调试模式(Debug 配置),会自动生成 .pdb 文件。在调试时,只要可执行文件和 .pdb 文件在相同的目录或者在调试器能够找到的路径下,调试器就会自动使用它来提供调试信息。不需要开发者手动进行额外的操作来“使用” .pdb 文件,它是无缝集成在调试过程中的。
总之,理解和掌握 C++ 中的静态库和动态库对于编写高效、可维护的代码至关重要。通过合理地使用库,可以提高代码的复用性、模块化程度,并且在不同的项目场景中选择合适的库类型能够优化程序的性能和部署方式。希望这篇教程能够帮助 C++ 编程的初学者清晰地理解这些概念和技术。
实践
以下是在 Windows 下创建和使用静态库与动态库的示例代码:
一、静态库
1. 创建静态库项目
- 创建静态库项目。
- 修改下配置:
- 移除所有VS自动创建的文件,在项目中添加以下源文件
math_functions.cpp
:
// math_functions.cpp
int add(int a, int b) {return a + b;
}int multiply(int a, int b) {return a * b;
}
- 以及头文件
math_functions.h
:
// math_functions.h
#ifndef MATH_FUNCTIONS_H
#define MATH_FUNCTIONS_Hint add(int a, int b);
int multiply(int a, int b);#endif
- 编译该项目,将会生成静态库文件。
- 我们可以生成多个平台下的库,根据自己的需要来生成,这里我就生成全部配置了。
- 将库打包。给其他项目项目使用,创建一个文件夹,把对应目录下把lib文件(PDB可选)、头文件放进去。此时我们就可以让其他同学或同事用我们 的库了。
2. 使用静态库
-
创建一个新的控制台应用程序项目。
-
配置第三方库
右键属性
或者在属性管理器找到对项目的属性。
这里只演示配置x64 Release 模式下配置库,其他模式类似。注意,如果在x64 Release 模式下,那么就要配置对应的在x64 Release模式下生成的库,不然就有问题。
- 首先把包含路径配置下,就是我们库的头文件路径,
注意我把 \
替换为了/
- 然后配置lib文件
- 然后写代码
// main.cpp
#include <iostream>
#include "math_functions.h"int main() {int num1 = 5, num2 = 3;std::cout << "加法结果:" << add(num1, num2) << std::endl;std::cout << "乘法结果:" << multiply(num1, num2) << std::endl;return 0;
}
- 编译运行即可
二、动态库
1. 创建动态库项目
- 创建动态库项目
- 与静态库类似,删除默认的代码文件,取消预编译头。
- 在项目中添加
math_functions_of_dynamic_lib.cpp
文件,并修改如下:
// math_functions_of_dynamic_lib.h.cpp
#include"math_functions_of_dynamic_lib.h"int add_of_dynamic_lib(int a, int b) {return a + b;
}int multiply_of_dynamic_lib(int a, int b) {return a * b;
}
- 以及头文件
math_functions_of_dynamic_lib.h
:
// math_functions_of_dynamic_lib.h
#ifndef MATH_FUNCTIONS_H
#define MATH_FUNCTIONS_H#ifdef BUILDING_DLL
# define DLL_EXPORT __declspec(dllexport)
#else
# define DLL_EXPORT __declspec(dllimport)
#endifDLL_EXPORT int add_of_dynamic_lib(int a, int b);
DLL_EXPORT int multiply_of_dynamic_lib(int a, int b);#endif
- 因为导出库(编译库),和导入库(其他项目调用此库)是不同的关键字,导出是__declspec(dllexport),导入是__declspec(dllimport)。所以我们可以在库项目中添加宏定义BUILDING_DLL,这样在编译库项目是有宏定义就会使用__declspec(dllexport),在导入的时候因为没有宏定义那么就会使用__declspec(dllimport)。
- 编译该项目,我们可以像前面的静态库那样来批生成
- 将库打包。给其他项目项目使用,创建一个文件夹,把生成的文件和头文件放进去。此时我们就可以让其他同学或同事用我们 的库了。
2. 使用动态库
-
使用动态库的方法和使用静态库的方法类似,都需要配置lib文件,头文件路径。这里不赘述。
- 我们在应用程序写:
// main.cpp
// main.cpp
#include <iostream>
#include "math_functions_of_dynamic_lib.h"int main() {int num1 = 5, num2 = 3;std::cout << "加法结果:" << add_of_dynamic_lib(num1, num2) << std::endl;std::cout << "乘法结果:" << multiply_of_dynamic_lib(num1, num2) << std::endl;return 0;
}
- 然后编译并运行,发现报错。
- 我们把对应的dll复制到exe的同级目录下即可运行成功注意我们这个应用程序是x64 release 下生成的,那么我们要复制的也是在x64 release 下生成的dll 库。
相关文章:
C++ 创建和配置dll与lib库
C简明教程(13)创建和配置dll与lib库_怎样生成lib库和dll库-CSDN博客 C 动态库与静态库详解 一、为什么要引入库的概念 在 C 编程中,随着项目规模的不断扩大,代码量也会急剧增加。如果将所有代码都写在一个源文件中,…...
深度剖析 Veo2 工具:解锁 AI 视频创作新境界
在当下这个 AI 技术日新月异的时代,各种 AI 工具如雨后春笋般涌现,让人目不暇接。今天,我就来给大家好好说道说道谷歌旗下的 Veo2,这可是一款在 AI 视频创作领域相当有分量的工具。好多朋友都在问,Veo2 到底厉害在哪?好不好上手?能在哪些地方派上用场?别着急,今天我就…...
LabVIEW自定义测量参数怎么设置?
以下通过一个温度采集案例,说明在 LabVIEW 中设置自定义测量参数的具体方法: 案例背景 假设使用 NI USB-6009 数据采集卡 和 热电偶传感器 监测温度,需自定义以下参数: 采样率:1 kHz 输入量程:0~10 V&a…...
JVM执行流程与架构(对应不同版本JDK)
直接上图(对应JDK8以及以后的HotSpot) 这里主要区分说明一下 方法区于 字符串常量池 的位置更迭: 方法区 JDK7 以及之前的版本将方法区存放在堆区域中的 永久代空间,堆的大小由虚拟机参数来控制。 JDK8 以及之后的版本将方法…...
数据治理项目为什么沦为了PPT工程?
数据治理项目为什么沦为了PPT工程? 数据治理项目为什么沦为PPT工程数据治理项目面临的深层挑战数据治理项目的破局之道 "这个项目明明做了快一年了,怎么感觉还在原地踏步?"数据治理小张最近很烦恼。 整天泡在会议室里,写…...
module ‘matplotlib.cm‘ has no attribute ‘get_cmap‘
目录 解决方法1: 解决方法2,新版api改了: module matplotlib.cm has no attribute get_cmap 报错代码: cmap matplotlib.cm.get_cmap(Oranges) 解决方法1: pip install matplotlib3.7.3 解决方法2,新版…...
HTML5 教程之标签(3)
HTML5 <center> 标签 (已废弃) 定义和用法 <center> 标签对其包围的文本进行水平居中处理。HTML5不支持使用<center>标签,因此有关该标签的更多信息,请参考“HTML <center>标签”部分! 示例: <center>这个…...
告别传统办公软件,这款编辑器让你事半功倍!
文章目录 1 界面的多样性2 性能优化3 文档编辑器的新功能4 外部文本支持5 体验感想 ONLYOFFICE最近发布了文档8.2版本,带来了众多新特性和性能改进。作为一名用户和开发者,我对这些更新进行了深入的体验,感受到了不少亮点。 新版本特别强调了…...
AI协助探索AI新构型自动化创新的技术实现
一、AI自进化架构的核心范式 1. 元代码生成与模块化重构 - 代码级自编程:基于神经架构搜索的强化学习框架,AI可通过生成元代码模板(框架的抽象层定义、神经元结点-网络拓扑态的编码抽象定义)自动组合功能模块。例如࿰…...
全能型免费内网穿透工具,全面支持macOS、Windows、Linux及Docker系统
1. 登陆官网网址并注册帐号 ngrok | API Gateway, Kubernetes Networking Secure Tunnels 2 下载并安装工具 3. 启动工具 在命令行执行 ngrok http http://localhost:8080 其中端口可换成用户自己想要穿透的端口 4. 获取穿透地址 命令执行后会出现如下画面,红…...
Web - CSS3浮动定位与背景样式
概述 这篇文章主要介绍了 CSS3 中的浮动定位、背景样式、变形效果等内容。包括 BFC 规范与创建方法、浮动的功能与使用要点、定位的多种方式及特点、边框与圆角的设置、背景的颜色、图片等属性、多种变形效果及 3D 旋转等,还提到了浏览器私有前缀。 BFC规范与浏览…...
VUE之组件通信(二)
1、v-model v-model的底层原理:是:value值和input事件的结合 $event到底是啥?啥时候能.target 对于原生事件,$event就是事件对象 ,能.target对应自定义事件,$event就是触发事件时,所传递的数据ÿ…...
Gauss高斯:建表语法,存储方式,OLTP和OLAP,系统时间,数组,分组(grouping set,rollup)
数据库和表的语法 数据库 表 oracle,高斯, hive的默认存储方式都是列式存储 存储方式 高斯数据库(GaussDB)支持列式存储和行式存储 OLTP 与 OLAP OLTP(联机事务处理,Online Transaction Processing)是一种用于管理…...
Java基础进阶
Java基础进阶 异常 概述 异常就是程序出现了不正常的情况 具体分为:Throwable—>(Error Exception);Exception—>(RuntimeException 非RuntimeException) Throwable类是Java语言中所有错误和异常的祖宗类;(上面还有Object类) Thr…...
【数据结构】链表应用1
链表应用 面试题 02.02.返回倒数第k个节点题目描述思路解题过程复杂度 查找相同后缀题目描述解题思路完整代码: 删除绝对值相等的节点题目描述解题思路代码 面试题 02.02.返回倒数第k个节点 题目描述 实现一种算法,找出单向链表中倒数第 k 个节点。返回…...
python gltf生成预览图
使用Python生成GLTF模型的预览图 随着3D技术的不断发展,GLTF(GL Transmission Format)逐渐成为了Web和移动应用程序中最流行的3D文件格式之一。GLTF文件不仅能以较小的体积存储复杂的3D模型,还支持动画、材质、光照和纹理等特性。…...
HTTP和HTTPS协议详解
HTTP和HTTPS协议详解 HTTP详解什么是http协议http协议的发展史http0.9http1.0http1.1http2.0 http协议的格式URI和URL请求request响应response http协议完整的请求与响应流程 HTTPS详解为什么使用HTTPSSSL协议HTTPS通信过程TLS协议 HTTP详解 什么是http协议 1、全称Hyper Tex…...
实战:利用百度站长平台加速网站收录
本文转自:百万收录网 原文链接:https://www.baiwanshoulu.com/33.html 利用百度站长平台加速网站收录是一个实战性很强的过程,以下是一些具体的步骤和策略: 一、了解百度站长平台 百度站长平台是百度为网站管理员提供的一系列工…...
专门记录台式电脑常见问题
1、蓝屏死机,检查内存硬盘和cpu 2、拆内存条,用橡皮擦金手指 3、放主板静电,扣主板电池 4、系统时间不正确,主板电池没电 5、开机键坏了 6、电脑主机的风扇转,正常通电运行,但显示器没信号。看键盘的num键&…...
数据库系统概念第六版记录 一
1.关系型数据库 关系型数据库(Relational Database,简称 RDB)是基于关系模型的一种数据库,它通过表格的形式来组织和存储数据。每个表由若干行(记录)和列(字段)组成,数据…...
本地Ollama部署DeepSeek R1模型接入Word
目录 1.本地部署DeepSeek-R1模型 2.接入Word 3.效果演示 4.问题反馈 上一篇文章办公新利器:DeepSeekWord,让你的工作更高效-CSDN博客https://blog.csdn.net/qq_63708623/article/details/145418457?spm1001.2014.3001.5501https://blog.csdn.net/qq…...
Meta Sapiens AI论文解读:人类视觉模型基石初现,AI 未来走向何方?
一、引言 在本文中,我们将深入探讨 Meta AI 的一项新成果,该成果发表于一篇题为《Sapiens:人类视觉模型的基础》的研究论文中。这篇论文介绍了一系列模型,这些模型针对四项以人类为中心的基本任务,正如我们在上面的演示…...
输入类控件和多元素控件【QT】
文章目录 输入类控件QLineEdit Text EditCombo BoxSpin BoxDialSlider多元素控件QListWidget TableWidetTreeWidgetQGroupBoxTab Widget# QVBoxLayout# QHBoxLayoutQGridLayoutQFormLayout 输入类控件 QLineEdit 例如: 实现一个用户输入姓名 密码 电话 性别 的功能…...
一键开启/关闭deepseek
一键开启/关闭 Deepseek对应下载的模型一键开启 Deepseek,一键关闭Deepseek双击对应的bat,就可以启动https://mbd.pub/o/bread/Z56YmpZvbat 下载:https://mbd.pub/o/bread/Z56YmpZv 可以自己写下来,保存成bat文件,也可…...
gitea - fatal: Authentication failed
文章目录 gitea - fatal: Authentication failed概述run_gitea_on_my_pkm.bat 笔记删除windows凭证管理器中对应的url认证凭证启动gitea服务端的命令行正常用 TortoiseGit 提交代码备注END gitea - fatal: Authentication failed 概述 本地的git归档服务端使用gitea. 原来的用…...
Spring AI 智能体通过 MCP 集成本地文件数据
作者:刘军 Model Context Protocol(MCP)简介 模型上下文协议(即 Model Context Protocol,MCP) [ 1] 是一个开放协议,它规范了应用程序如何向大型语言模型(LLM)提供上下…...
音视频入门基础:RTP专题(5)——FFmpeg源码中,解析SDP的实现
一、引言 FFmpeg源码中通过ff_sdp_parse函数解析SDP。该函数定义在libavformat/rtsp.c中: int ff_sdp_parse(AVFormatContext *s, const char *content) {const char *p;int letter, i;char buf[SDP_MAX_SIZE], *q;SDPParseState sdp_parse_state { { 0 } }, *s1…...
MyBatis XML文件配置
目录 一、 配置连接字符串和MyBatis 二、书写持久层代码 2.1 添加Mapper接口 2.2 添加UserlnfoXMLMapper.xml 三、增删改查 3.1 、增(Insert) 3.2、删(Delete) 3.3、改 (Update) 3.4、查 (Select) MyBatisXML的方式需要以下两步&am…...
【Leetcode 热题 100】1143. 最长公共子序列
问题背景 给定两个字符串 t e x t 1 text_1 text1 和 t e x t 2 text_2 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 0 0。 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变…...
【算法】动态规划专题④ ——LCS(最长公共子序列)+ LPS(最长回文子序列) python
目录 前置知识LCS举一反三LPS 前置知识 【算法】动态规划专题③ ——二维DP python 子序列定义为: 不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。 LCS 最长公共子序列 https://www.lanqiao.cn/problems/1189/learning/?p…...
Cesium点集中获取点的id,使用viewer.value.entities.getById报错的解决方法
错误代码: viewer.value.entities.getById(pickedObject.id) 报错: 可以正常获取movement.position但是一直出现如下报错,无法获得航点的id,通过断点定位为 viewer.value.entities.getById(pickedObject.id)导致的报错 解决方…...
360手机刷机 360手机解Bootloader 360手机ROOT
360手机刷机 360手机解Bootloader 360手机ROOT 问:360手机已停产,现在和以后,能刷机吗? 答:360手机,是肯定能刷机的 360手机资源下载网站 360手机-360手机刷机RootTwrp 360os.top 360rom.github.io 一、…...
深度探索DeepSeek-R1:AI大模型的本地应用与个人知识库构建
深度探索DeepSeek-R1:AI大模型的本地应用与个人知识库构建 引言 在当今这个信息爆炸的时代,如何高效地存储、处理和获取知识,已经成为每个人面临的挑战。想象一下,如果你能在没有互联网连接的情况下,构建一个属于自己…...
LabVIEW图像采集与应变场测量系统
开发了一种基于LabVIEW的图像采集与应变场测量系统,提供一种高精度、非接触式的测量技术,用于监测物体的全场位移和应变。系统整合了实时监控、数据记录和自动对焦等功能,适用于工程应用和科学研究。 项目背景 传统的位移和应变测量技术往往…...
解决DeepSeek服务器繁忙问题:本地部署与优化方案
deepseek服务器崩了,手把手教你如何在手机端部署一个VIP通道! 引言 随着人工智能技术的快速发展,DeepSeek等大语言模型的应用越来越广泛。然而,许多用户在使用过程中遇到了服务器繁忙、响应缓慢等问题。本文将探讨如何通过本地部…...
今日AI和商界事件(2025-02-05)
今日AI领域的相关事件主要包括以下几个方面: 一、DeepSeek引发全球关注 性能与成本优势: DeepSeek推出的R1模型性能出色,成本较低,在全球AI行业引发震动。该模型在数学、代码处理等方面性能优异,受到广泛赞誉。 平台…...
SQL 秒变 ER 图 sql转er图
🚀SQL 秒变 ER 图,校园小助手神了! 学数据库的宝子们集合🙋♀️ 是不是每次碰到 SQL 转 ER 图就头皮发麻?看着密密麻麻的代码,脑子直接死机,好不容易理清一点头绪,又被复杂的表关…...
SQL server 创建DB Link 详解
在日常工作中,经常涉及到跨库操作,为使跨数据库的操作变得更加灵活高效,我们可以在 SQL Server 中建立数据库链接( DB Link),实现 SQL Server 数据库与其他数据库(如 Oracle, MySQL 等ÿ…...
25.2.5学习记录
今天主要学的是哈希表的理论知识,但是都是c实现,C语言的代码实现还没有完全搞明白。 在写题的时候,懵懂的学着正确代码,用C语言模拟实现哈希表去解题。 在哈希表的理论知识中,学到哈希函数,了解哈希冲突产…...
C# List 列表综合运用实例⁓Hypak原始数据处理编程小结
C# List 列表综合运用实例⁓Hypak原始数据处理编程小结 1、一个数组解决很麻烦引出的问题1.1、RAW 文件尾部数据如下:1.2、自定义标头 ADD 或 DEL 的数据结构如下: 2、程序 C# 源代码的编写和剖析2.1、使用 ref 关键字,通过引用将参数传递,以…...
不可信的搜索路径(CWE-426)
漏洞描述:程序使用关键资源时(如动态链接库、执行文件、配置文件等)没有明确的指定资源的路径,而是依赖操作系统去搜索资源,这种行为可能被攻击者利用,通过在搜索优先级较高的目录放置不良资源,…...
Unity 2D实战小游戏开发跳跳鸟 - 记录显示最高分
上一篇文章中我们实现了游戏的开始界面,在开始界面中有一个最高分数的UI,本文将接着实现记录最高分数以及在开始界面中显示最高分数的功能。 添加跳跳鸟死亡事件 要记录最高分,则需要在跳跳鸟死亡时去进行判断当前的分数是否是最高分,如果是最高分则进行记录,如果低于之前…...
openeuler 22.03 lts sp4 使用 cri-o 和 静态 pod 的方式部署 k8s-v1.32.0 高可用集群
前情提要 整篇文章会非常的长…可以选择性阅读,另外,这篇文章是自己学习使用的,用于生产,还请三思和斟酌 静态 pod 的部署方式和二进制部署的方式是差不多的,区别在于 master 组件的管理方式是 kubectl 还是 systemctl有 kubeadm 工具,为什么还要用静态 pod 的方式部署?…...
穷举vs暴搜vs深搜vs回溯vs剪枝系列一>黄金矿工
目录 决策树:代码设计代码: 决策树: 代码设计 代码: class Solution {boolean[][] vis;int ret,m,n;public int getMaximumGold(int[][] grid) {m grid.length;n grid[0].length;vis new boolean[m][n]; for(int i 0; i <…...
SQL Server配置管理器无法连接到 WMI 提供程序
目录 第一步第二部 第一步 发现没有资源管理器 在文件夹找到管理器 打开发现报这个错误 配置管理器无法连接到 WMI 提供程序第二部 https://blog.csdn.net/thb369208315/article/details/126954074...
微信小程序获取openid和其他接口同时并发请求如何保证先获取到openid
在微信小程序中,如果你需要并发请求获取 openid 和其他接口的数据,并且希望确保先获取到 openid 之后再进行后续操作,可以考虑以下几种方法: 方法一:使用 Promise 链 1, 先请求 openid:使用 Promise 来请求 openid。 2, 在获取到 openid 后再请求其他接口。 function g…...
为AI聊天工具添加一个知识系统 之87 详细设计之28 Derivation 统一建模元模型 之1
文本要点 要点 Derivation 统一建模元模型 Derivation 统一建模元模型:意识原型的祖传代码,即支撑 程序框架的 符号学中的 自然和逻辑树。 这棵树的雏形中描述了三种建模工件:语用钩子,语法糖和语义胶水。 三种工件对应的三“…...
java进阶知识点
java回收机制 浅谈java中的反射 依赖注入的简单理解 通过接口的引用和构造方法的表达,将一些事情整好了反过来传给需要用到的地方~ 这样做得好处:做到了单一职责,并且提高了复用性,解耦了之后,任你如何实现…...
63.视频推荐的算法|Marscode AI刷题
1.题目 问题描述 西瓜视频正在开发一个新功能,旨在将访问量达到80百分位数以上的视频展示在首页的推荐列表中。实现一个程序,计算给定数据中的80百分位数。 例如:假设有一个包含从1到100的整数数组,80百分位数的值为80…...
19.[前端开发]Day19-王者荣项目耀实战(二)
01_(掌握)王者荣耀-main-banner展示实现 完整代码 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewpor…...