动静态库【Linux操作系统】
文章目录
- 动静态库
- 制作静态库
- 如何把第三方库安装在Linux系统中,如何使用第3方库
- 方案一:
- 为什么我们之前使用gcc/g++编译C/C++标准库的时候不用加选项-l xxx呢?
- 方案二:
- 方案三:
- 为什么不同平台的库不一样呢?
- 动态库的制作和使用
- 动态库的制作
- 动态库名字格式:
- 使用动态库
- 动态库的加载
- 动态库的具体加载过程(可能需要下一篇文章的知识)
- 动静态库的优缺点
- 静态库
- 优点
- 缺点
- 动态库
- 优点
- 缺点
- 选择建议
动静态库
库的本质就是.o文件的集合,即把所有.o文件链接在一起就成了库
如果编译时同时提供去掉前缀和后缀之后同名的静态库和动态库
gcc/g++会优先使用动态库
此时如果非要用静态库,那就在编译时增加一个选项-static
-static
选项的作用是:只使用静态库
库的作用主要是:
①把我们自己实现的方法(源文件)隐藏起来,不能直接给别人看
②提供给别人使用
头文件的作用是:
①方便自己管理函数
②方便使用我们的库的人查看函数的返回值,参数表
所以头文件不需要隐藏,反而必须给别人看
制作静态库
步骤:
①把所有源文件编译成可以被直接链接
的.o文件
②使用命令ar -rc
自定义库文件名 所有.o文件
ar -rc解析
1.命令ar:表示要把.o文件打包形成静态库
2.选项-rc:表示如果被打包的.o文件中有重复的,那么就去重
静态库文件名的格式:
①最开头的3个字符必须是lib
②后缀必须是.a或者.a.1.23[.a后面的数字表示库的版本]
如何把第三方库安装在Linux系统中,如何使用第3方库
逻辑链:
使用第3方库→得先有第三方库的代码→要安装第三方库→库有头文件+库本体,这两个都得安装→写代码时包含第三方库头文件→编译器编译时得能找到第三方库的头文件和库代码→编译器就得知道去什么目录下找第三方库的头文件,去什么路径下找第三方的库本体→目录下可能有多个库→所以还要知道第三方库的名字
方案一:
具体流程:
-
把库的头文件都拷贝进Linux中存放头文件的目录
/usr/include
(这个目录的路径由编译器决定) -
把我们的库(我们写的库对于Linux来说也是第3方库)拷贝到Linux中存放库文件的目录/lib64
-
安装好之后,编写代码的时候就可以直接使用<>包含我们写的库的头文件,使用我们的库的方法了
-
但是如果使用了第3方库,编译的时候就要在末尾加选项:-l xxx [
xxx表示第3方库的名字,去掉前缀lib和后缀.a(.so)之后的字符串
]
并且包含了几个第3方库,就要多加几个这个选项
因为/lib64目录下不止一个库,你不指定名字,编译器怎么知道是哪个库?
例
第三方库:libsss.a
方案二编译命令:g++ -o test.cpp -l sss
其中:test.cpp是包含main函数的源文件
为什么我们之前使用gcc/g++编译C/C++标准库的时候不用加选项-l xxx呢?
这是因为gcc/g++编译器是C/C++语言编译器,C/C++有自己的标准库,也在Linux中安装了标准库
所以C/C++编译器默认肯定就知道自己标准库的名字
我们写的库对于C/C++来说也是第三方库,他肯定不知道我们的名字
Linux中安装的库那么多,他不知道名字怎么找到第3方库?
方案二:
如果不把库放进Linux专门存放库的目录下,因为编译器查找库的时候,默认只会去专门存放库文件的目录下查找
所以要找到这个第3方库除了使用选项-l xxx还要指明它在哪条路径下
这样编译器就会在用户指定路径和Linux专门存放的目录下都找一找
如果同名了,就先找到哪个用哪个
方法:
编译链接的时候在方案一的基础上,再新增选项-L 路径
例
第三方库:libsss.a
方案二编译命令:g++ -o test.cpp -l sss -L ./lib
其中:test.cpp是包含main函数的源文件,./lib就是存放库libsss.a的路径
方案三:
发布库和头文件
-
生成静态库
-
创建在新建一个目录a,然后在里面再创建lib和include目录
-
把所有库放进lib目录,把所有库的头文件放进include目录
-
使用zip/tar命令打包目录a
-
别人获得我打包的目录之后,可以安装到操作系统中
也可以在编译时
通过选项-I(这个字母是大写的i)
路径找到头文件所处目录,再通过选项-L 路径找到库所处目录,最后通过选项-l 库名找到要使用第库
例
第三方库:libsss.a
方案三编译命令:
g++ -o test.cpp -l sss -L ./ilib -I ./include
其中:test.cpp是包含main函数的源文件,./lib就是存放库libsss.a的路径,./include就是存放库头文件的路径
为什么编译时不需要指定头文件的名字?
为啥第三方库的名字要用-l选项指定,头文件却不需要呢?
因为你自己编写代码的#include的时候,就已经指定了
为什么不同平台的库不一样呢?
因为库本质是.o文件的集合
而不同平台的编译规则可能不一样
,所以编译之后形成的.o文件就不一样,进而导致库不一样
在一个不同平台安装库,本质就是用同一份源代码,在对应平台上编译一下,此时生成的.o文件就是根据这个平台的编译规则而生成的了
动态库的制作和使用
动态库的制作
动态库本质也是.o文件的集合
但是形成动态库的.o文件比较特殊
在使用gcc/g++编译源文件的时候生成.o文件时,要在gcc/g++后面加选项-fPIC
生成拥有与位置无关码的.o文件
制作命令:
gcc -o 动态库文件名 所有的.o文件 -shared -fPIC
选项-shared的作用是
告诉编译器不要生成可执行程序,而是生成动态库
动态库名字格式:
①最开头3个字符为lib
②后缀为.so
使用动态库
编译器找到动态库生成可执行程序的方法和找静态库的方法一模一样
都是
①通过-I找到头文件的位置
②通过-L找到库的位置
③通过-l找到具体是那一个库
但是形成可执行程序之后,运行进程的是操作系统,与编译器没有任何关系了
所以我们如果直接运行可执行程序,可能也会报错
因为编译器编译形成可执行程序之后,只会把可执行程序依赖的库的名字告诉操作系统
而运行的时候,调用库函数时,是得在内存中找到动态库,去动态库里面执行代码
所以:操作系统还得把动态库加载到内存,并映射到进程的地址空间
所以:必须得先找到动态库
因为操作系统运行时查找动态库的时候,也只会在Linux专门存储库的目录(/lib64)里找
如果找不到,就报错了
如何解决?
-
把我们写的第3方动态库,拷贝到系统默认查找库的目录下(即/lib64)
-
使用软链接
,在系统默认查找库的目录下建立一个指向我们写的动态库的软连接 -
配置环境变量
LD_LIBRARY_PATH
,如果bash环境变量表里面里面还没有这个环境变量的话,直接手动导入即可(配置信息的时候尽量使用绝对路径)
因为进程知道自己依赖的动态库名字,只是不知道库的路径
所以配置环境变量的时候,只需要路径,不需要在路径最末尾加上库名字
注意:
只把环境变量LD_LIBRARY_PATH导入到进程自己的环境变量表中,不导入bash的环境变量表中是没用的
因为在进程运行之前,操作系统/bash就会为该进程找动态库了,找不到就报错了 -
在Linux中的/etc/ld.so.conf.d目录下,新建一个后缀为.conf的配置文件,在里面写上我们写的库的所处目录的路径
因为系统找库时,默认会在这些配置文件里面的路径中找
再使用ldconfig更新系统的默认查找库路径
上面4种方法中,常用的方法就是第1种和第3种
动态库的加载
动静态库也是文件
动静态库本质都是.o文件的集合
而.o文件又是编译好的可以直接被CPU调用的二进制代码
所以只需要把动态库加载到内存,并让依赖这个动态库的进程能看见它
进程再执行到库函数的时候,就可以找到这个动态库,拿着它里面的代码给CPU
如何让进程看见动态库?
只需要把动态库放进,进程的虚拟地址空间中的共享区
(即共享区的虚拟地址通过页表,映射物理内存中存储动态库的物理地址
)
所以我们进程执行库函数,是在自己的进程地址空间中跳转运行的
但是可能出现多个进程依赖同一个动态库的情况
此时需要多次加载动态库吗?
肯定不需要啊
只需要加载一份动态库,再把所有进程的虚拟地址空间中的共享区,通过页表映射到动态库就可以了
这也是为什么操作系统喜欢使用动态库的原因,使用动态库的进程无论有多少,都只需要一个动态库,节省内存
如果进程都使用静态库
静态库的方法都存储在进程自己的代码中
①不仅可执行程序的大小会变大
②多个进程加载到内存时,因为都有静态库占用的内存也会变大
动态库的具体加载过程(可能需要下一篇文章的知识)
库的文件格式也是ELF格式
所以库也会给自己的代码和数据编址
库的编址也是采用平坦模式
所以逻辑地址=偏移量
所以库里面的函数的地址=偏移量
进程如何在运行时,找到动态库中的方法:
-
操作系统找到依赖的动态库对应结构体变量,如果内存中没有该动态库,就先
把该动态库加载到内存
-
通过动态库的结构体,拿到动态库的起始物理地址,再为库创建一个
struct vm_area_struct
节点,再在页表中建立库的物理地址与虚拟地址的映射 这样库就映射到了进程地址空间中的共享区 -
在链接动态库形成可执行文件的时候,就把可执行文件中调用库函数的那一个代码,修改成了
动态库的名字+那个函数在动态库里面的偏移量
比如调用printf的代码就会被修改成:libc.so:0x1363
(此处的偏移量是乱写的)
而在动态库映射到进程地址空间中之后,我们就得到了这个动态库的起始虚拟地址
然后就可以再把进程代码区中的动态库的名字也替换成它的虚拟起始地址
所以:libc.so:0x1363→0x1002:0x1363
(这个过程就叫地址重定位) -
再运行进程时,CPU执行到库方法的时候,直接
通过动态库的虚拟起始地址和方法的偏移量
,去共享区找到库中对应的方法,执行完再返回
所以动态库被映射到一个进程的共享区中的任意位置都可以,同一个动态库映射到多个进程中时起始地址也随意,这就是动态库与位置无关的特性
动静态库的优缺点
静态库
优点
-
独立性
代码在编译时直接嵌入到可执行文件中,==即使静态库没了,程序也能继续运行 -
性能
==函数调用无动态链接的开销(如符号解析、加载等),运行时速度略 -
兼容性
不依赖系统环境中的库版本,避免因动态库版本冲突导致的问题。
缺点
-
体积大
库代码会被复制到每个使用它的可执行文件中,导致最终文件体积较大(尤其是多进程场景下内存占用更高) -
更新困难
库更新需重新编译所有依赖它的程序,不适合频繁升级的场景。 -
冗余性
多个程序无法共享同一份库代码,内存利用率低。
动态库
优点
-
节省资源
多个程序共享同一份库文件,减少磁盘和内存占用 -
更新灵活
更新库文件后,所有依赖它的程序无需重新编译即可生效
即:库文件与程序文件独立,只要输出接口不变,更换库文件不会对程序文件造成任何影响,因而极大地提高了可维护性和可扩展性 -
模块化
支持运行时加载(如插件系统),增强程序扩展性
缺点
-
依赖性强
程序运行时需确保系统中存在正确版本的库文件,否则会崩溃 -
性能开销
需要映射到进程地址空间中,即需要给库分配虚拟地址,可能有轻微性能损失 -
兼容性风险
库版本升级若破坏 ABI(二进制接口兼容性),会导致依赖程序无法运行。
选择建议
用静态库的场景
要求部署简单(如单文件工具)、对性能敏感
,或目标环境缺乏稳定的库支持。
用动态库的场景
注重资源共享(如系统基础库)、需要热更新,或开发大型模块化应用。
相关文章:
动静态库【Linux操作系统】
文章目录 动静态库制作静态库如何把第三方库安装在Linux系统中,如何使用第3方库方案一:为什么我们之前使用gcc/g编译C/C标准库的时候不用加选项-l xxx呢?方案二:方案三: 为什么不同平台的库不一样呢?动态库…...
Day 4:牛客周赛Round 91
好久没写了,问题还蛮多的。听说这次是苯环哥哥出题 F题 小苯的因子查询 思路 考虑求因子个数,用质因数分解;奇数因子只需要去掉质数为2的情况,用除法。 这里有个比较妙的细节是,提前处理出数字x的最小质因数࿰…...
drawDB:打造高效数据库设计流程
drawDB:打造高效数据库设计流程 drawDB 简介资源链接 核心功能详解1. 直观的实体关系图设计2. SQL 脚本生成3. SQL 导入功能4. 本地化存储与分享功能5. 自定义主题与外观 安装和使用教程本地开发环境搭建构建生产版本Docker 部署基本使用方法 应用场景和实际价值适用…...
【心海资源】子比主题新增注册与会员用户展示功能模块及实现方法
内容改写: 本次分享的是子比主题顶部展示注册用户与会员信息的功能模块及其实现方式。 你可以通过两种方式启用该功能: 直接在后台进入“外观 → 小工具”启用该展示模块,操作简便;也可将提供的代码覆盖至子比主题目录中&#…...
gitblit安装教程,搭建一个属于自己的Git版本仓库
本章教程,主要记录如何在Windows服务器上利用gitblit搭建GIT私有化仓库。 一、gitblit简介 官网地址:https://www.gitblit.com/ Gitblit 是一个开源的纯 Java 技术栈,用于管理、查看和服务Git仓库。 它主要设计为一款面向希望托管集中式仓库的小型工作组的工具。 二、基础环…...
2023年第十四届蓝桥杯省赛B组Java题解【简洁易懂】
2023年第十四届蓝桥杯省赛B组Java题解 题型概览与整体分析 题目编号题目名称题型难度核心知识点通过率(预估)A阶乘求和结果填空★☆☆模运算、数学规律95%B幸运数字结果填空★★☆进制转换、数位和计算80%C数组分割编程题★★☆组合数学、奇偶性分析65…...
Javase 基础加强 —— 01 异常
本系列为笔者学习Javase的课堂笔记,视频资源为B站黑马程序员出品的《黑马程序员JavaAI智能辅助编程全套视频教程,java零基础入门到大牛一套通关》,章节分布参考视频教程,为同样学习Javase系列课程的同学们提供参考。 01 课程安排…...
iview 表单验证问题 Select 已经选择 还是弹验证提示
问题:iview 的 Select 下拉框的时候,数据验证必填,明明选择了数据,却一直提示验证不能通过 html代码: <Form ref"FormData" :model"FormData" :rules"ruleValidate" :label-width&qu…...
OrCAD中离图连接器、端口及网络标签的作用范围与选择指南
一、OrCAD主要连接元素概述 在OrCAD Capture原理图设计环境中,有三种主要的网络连接元素:离图连接器(Off-Page Connector)、端口(Port)和网络标签(Net Alias)。理解它们的作用范围和使用场景对设计清晰、可维护的原理图至关重要。 PS: 电源和…...
dpm_sysfs_add
这段代码是 Linux 内核中**设备电源管理(PM)子系统**与 **sysfs 文件系统**交互的核心实现,主要功能是为设备创建电源管理相关的 sysfs 属性文件。以下从五个关键维度进行深度解析: --- ### 一、功能架构全景 mermaid graph TD …...
【AI论文】Phi-4-reasoning技术报告
摘要:我们引入了Phi-4-reasoning,这是一种拥有140亿参数的推理模型,在复杂的推理任务中表现出了强大的性能。 通过监督式微调Phi-4,在精心策划的“可教”提示集上进行训练,这些提示集是根据复杂性和多样性的适当水平选…...
Android ART运行时无缝替换Dalvik虚拟机的过程分析
目录 一,概述 二,dex文件优化 一,概述 Android 4.4发布了一个ART运行时,准备用来替换掉之前一直使用的Dalvik虚拟机,希望籍此解决饱受诟病的性能问题。老罗不打算分析ART的实现原理,只是很有兴趣知道ART是如何无缝替换掉原来的Dalvik虚拟机…...
node.js为什么产生?
从官网得知介绍如下 https://nodejs.org/zh-cn/learn/getting-started/introduction-to-nodejs Node.js是一个开源和跨平台的JavaScript运行时环境。 Node.js在浏览器之外运行V8 JavaScript引擎,这是Google Chrome的核心。这使得Node.js具有很高的性能。 Node.js应…...
智能工厂边缘计算:从数据采集到实时决策
智能工厂边缘计算:从数据采集到实时决策 引言 在智能制造场景中,传统云计算架构面临三大核心挑战:平均200ms的网络延迟无法满足实时控制需求,90%的工业数据未被有效利用,以及每月高达15TB的数据传输成本。边缘计算技术通过将计算能力下沉到数据源头,正在构建"端-边…...
个人健康中枢的多元化AI网络革新与精准健康路径探析
引言 随着数字化转型的深入推进,个人健康中枢作为集成化健康管理系统,正在从传统的单一功能向多元化的AI驱动方向快速发展。在这一背景下,新兴网络硬件技术,特别是DPU(数据处理单元)和全光网络的出现,为个人健康中枢的革新提供了前所未有的机遇。本研究将深入探讨这些技…...
前端面试宝典---性能优化
一、加载优化 1. 第三方模块放在CDN 例如 leaflet通过cdn引入,这样就不会占用打包体积了 2. prefetch 预加载 例如,之后马上有个场景需要一个图片,我们就可以通过link 的 prefetch 对资源进行预先加载 再例如,我们公司是无网络开…...
【Springboot进阶】springboot+mybatis+jsqlparser实现数据权限控制
文章目录 SpringBoot JSqlParser MyBatis 数据权限实现方案一、环境准备1. 添加依赖 二、用户上下文管理1. 用户上下文持有类 三、数据权限拦截器实现1. MyBatis拦截器核心类 四、Spring Security集成1. 用户信息注入 五、配置项示例application.yml 六、使用示例1. 业务查询…...
【PostgreSQL数据分析实战:从数据清洗到可视化全流程】2.3 窗口函数与高级聚合(ROW_NUMBER()/RANK()/SUM() OVER())
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 PostgreSQL窗口函数与高级聚合:从排序到动态分析的全场景应用1. 窗口函数核心概念解析1.1 窗口函数语法结构1.2 核心组成要素2. 排名窗口函数深度解析2.1 ROW_NUMBER():唯一顺序排名示例演示2.2 `RANK…...
python全自动爬取m3u8网页视频(各类网站都通用)
当前人工智能,大语言模型的火热,使得python这门编程语言的使用越来越广泛。最近也开始学习了python,发现它在自动化方面的确有得天独厚的优势。python的简单易用,丰富的开源库,完善的生态,使得它有可能成为…...
C++负载均衡远程调用学习之上报功能与存储线程池
目录 1. Lars-reportV0.1 report模块介绍 2.Lars-reporterV0.1 reporter项目目录构建 3.Lars-ReporterV0.1 数据表和proto协议环境搭建 4.Lars-ReporterV0.1上报请求业务处理 5.Lars-ReporterV0.1上报请求模块的测试 6.Lars-ReporterV0.2开辟存储线程池-网络存储分离 1. L…...
今天python练习题
目录 一、每日一言 二、练习题 三、效果展示 四、下次题目 五、总结 一、每日一言 不要害怕失败,失败可能成为我们前进的动力! 二、练习题 有列表lst [[1,2,3],[4,5,6],[7,8,9]],取出其中的元素1/5/9组成新的列表 # 有列表lst [[1,2,3],[4,5,6],[…...
【leetcode100】最长递增子序列
1、题目描述 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。 …...
R绘图|3分钟复现瑞士“苏黎世大学”Nature全球地图——基于R包ggplot2+sf等
一、引言 本文我们复现苏黎世大学团队Franois Keck等在Nature最新文章“The global human impact on biodiversity”中的全球地图。 之前的图纸是在平面坐标系里面进行绘制,本次我们在罗宾逊投影中进行绘制。整体代码逻辑非常简单,就是采样点坐标系的转换…...
百度系列产品学习
1.react-bmapgl封装逻辑 Map 分析react-bmapgl库中Map组件的封装流程,并以mermaid图展示。首先分析Map组件的核心实现,包括生命周期方法和子组件渲染逻辑。然后研究WrapperHOC和Component基类的封装模式,理解事件绑定和属性处理的通用逻辑。…...
高等数学第三章---微分中值定理与导数的应用(3.4~3.5)
3.4 函数的单调性与曲线的凹凸性 一、函数的单调性 1. 函数单调性定义回顾 设函数 f ( x ) f(x) f(x) 的定义域为 D D D,区间 I ⊆ D I \subseteq D I⊆D。 如果对任意 x 1 , x 2 ∈ I x_1, x_2 \in I x1,x2∈I,当 x 1 < x 2 x_1 < x…...
idea结合CopilotChat进行样式调整实践
一、前言: 本文主要分享在前端开发中借助AI能力调整样式,提高开发效率 对应视频【idea结合CopilotChat进行样式调整实践-哔哩哔哩】 二、实践: 2-1、现状确认: 表格上方新增了button、swtich、select组件,需要调整…...
668SJBH报刊发行系统
1 前言 随着我国信息产业的迅猛发展,手工管理方式已不适应社务管理的要求,报社的日常管理正面临着信息化的挑战,采用计算机管理以提高服务质量和管理水平势在必行。发行管理是社务管理的一个重要组成部分,是报社和客户联系的纽带…...
格式化字符串漏洞
原理 在c中,printf函数在打印输出变量时通常不是直接输出,而是用一个占位符如%s printf("the number is %d\n",a);//通常用 printf(a);//而不是直接输出 虽然直接输出也没有太大的问题,但如果用格式化输出,没有给后面…...
如何查看电脑IP地址和归属地:全面指南
在数字化时代,了解自己电脑的IP地址和归属地信息变得越来越重要。无论是进行网络故障排查、远程办公设置,还是出于网络安全考虑,掌握这些基本信息都很有必要。本文将详细介绍如何查看电脑的公网IP、内网IP以及归属地信息,并提供常…...
深入解析 MQTT 协议:物联网通信的基石
在当今物联网蓬勃发展的时代,设备之间高效、可靠的通信变得至关重要。MQTT(Message Queuing Telemetry Transport)协议,作为一种轻量级的消息传输协议,正逐渐成为物联网通信的基石,广泛应用于各种场景中。 …...
48变现干货:分销裂变方式提高销量
产品运营活动中,我们可以根据对产品属性和特性,进行选择特定的方法,分销便是一种低成本各方获利的行为之一,但并不一定100%适用所有产品。 分销及裂变的概念 “分销”是指通过用户、达人、KOL等非官方渠道,参与产品的推广与销售,并获得相应收益的机制。它是一种以奖励为…...
AI入门:Prompt提示词写法
提示词(Prompt)是人与AI沟通的桥梁,它不是冰冷的代码指令,而是一场充满智慧与温度的对话。掌握精妙的提示词撰写技巧,能让AI更精准地理解需求,高效输出理想结果。其核心就在于——将AI视作身边真实的朋友、…...
MySQL复合查询全解析:从基础到多表关联与高级技巧
前言: 本文主要讲解了在MySQL中的复合查询,下面是关于本文章所需要数据的建表语句 创建表的语句: DROP database IF EXISTS scott; CREATE database IF NOT EXISTS scott DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;USE scott;D…...
移动 Trae 目录到 E 盘 - 解决 C 盘空间不足问题
移动 Trae 目录到 E 盘 - 解决 C 盘空间不足问题 1️⃣ 准备工作2️⃣ 移动原始文件夹3️⃣ 创建符号链接4️⃣ 清理原始文件夹5️⃣ 验证操作📝 注意事项🔄 常见问题排查1️⃣ 准备工作 关闭 Trae 程序:确保所有 Trae 相关进程已完全退出(包括后台服务)。创建目标文件夹…...
【AI论文】COMPACT:从原子级到复杂级的组合式视觉能力调优
摘要:多模态大语言模型(MLLM)擅长简单的视觉语言任务,但在面对需要多种能力的复杂任务时却很吃力,例如同时识别物体、计算数量和理解它们的空间关系。 这可能部分是由于视觉指令调整(VIT)这一ML…...
【leetcode】队列 + 宽搜,树形结构层序遍历的基础与变化
前言 🌟🌟本期讲解关于力扣的几篇题解的详细介绍~~~ 🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客 🔥 你的点赞就是小编不断更新的最大动力 🎆那么废话不…...
Spring AI聊天模型API:轻松构建智能聊天交互
Spring AI聊天模型API:轻松构建智能聊天交互 前言 在当今数字化时代,智能聊天功能已成为众多应用程序提升用户体验、增强交互性的关键要素。Spring AI的聊天模型API为开发者提供了一条便捷通道,能够将强大的AI驱动的聊天完成功能无缝集成到…...
力扣-链表-2 两数相加
思路 两个指针同时遍历,维护一个进位值,同时还要维护第一个链表的前序,如果第二个链表比第一个长的时候,利用这个前序指针把第二个链表多余的内容,添加到第一个链表的末尾 代码 class Solution {public ListNode ad…...
leetcode 59. 螺旋矩阵 II
题目描述 代码: class Solution { public:vector<vector<int>> generateMatrix(int n) {vector<vector<int>> res(n,vector<int>(n,0));int num 1;int len n;int start 0;while(len > 0){int row start;int column start;if…...
【操作系统】深入理解内存管理:从虚拟内存到OOM Killer
引言 在现代计算机系统中,内存管理是操作系统最核心的功能之一。本文将围绕内存管理的几个关键概念展开讨论,包括虚拟内存机制、内存分配原理、OOM Killer的工作机制以及不同系统架构下的内存限制。 虚拟内存:突破物理限制的关键技术 虚拟…...
《政治最后的日子》章节
政治与中世纪教会的类比性衰落 作者提出现代民族国家正重复中世纪教会的衰落轨迹: 两者均曾作为社会组织核心存在约5个世纪 晚期都成为生产力阻碍(中世纪教会税收负担/现代国家官僚低效) 末期均出现管理者普遍腐败与公众蔑视(…...
Rust Trait 学习
概述 特征(trait)是rust中的概念,类似于其他语言中的接口(interface)。特征定义了一个可以被共享的行为,只要实现了特征,你就能使用该行为。 如果不同的类型具有相同的行为,那么我们…...
基于开源链动2+1模式AI智能名片S2B2C商城小程序的爆品力构建研究
摘要:在兴趣电商生态中,爆品力已成为品牌实现指数级增长的核心竞争力。本文以开源链动21模式AI智能名片S2B2C商城小程序为技术载体,结合抖音平台的内容传播特性,提出“需求挖掘-技术赋能-内容转化”三位一体的爆品力构建模型。通过…...
【SimSession 】2:PacedReceiver:支持与 PacedVideoSender 本地联调
单独的基于libuv的发送能力,如何进一步在SimSession内集成使用?打算进行本地模拟俩线程,发送和接收,进行测试: 单独的发送测试 【SimSession】1:将视频发送逻辑与 libuv 事件循环集成是一个典型的并发设计问题 分析后,D:\XTRANS\thunderbolt\ayame\zhb-bifrost\player-…...
5 什么情况下需要微调
这个问题其实很重要,因为现代大模型训练出来已经非常强大,可能真的不需要微调。 我们可以通过 RAG 或提示词工程来实现目标。 需要微调的场景与替代方案分析 微调(Fine-tuning)确实不是所有场景都必需的,特别是考虑到现代大型语言模型(LLM…...
Docker 渡渡鸟镜像同步站 使用教程
Docker 渡渡鸟镜像同步站 使用教程 🚀 介绍 Docker.aityp.com(渡渡鸟镜像同步站)是一个专注于为国内开发者提供 Docker 镜像加速和同步服务的平台。它通过同步官方镜像源(如 Docker Hub、GCR、GHCR 等),为…...
位图的实现和拓展
一:位图的介绍 ①:需要位图的场景 给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中? 要判断一个数是否在某一堆数中,我们可能会想到如下方法: A…...
字符串问题c++
题目描述 小 Z 有一个字符串 s,他对这个字符串会进行如下两个操作: 1 p c 把字符串的第 p 个字符改成 c2 l r 把 s 的第 l 个字符到第 r 个字符按顺序输出。 这里『第 i 个字符』的下标计数从 1 开始,例如,a 是字符串 abc 的第…...
Redis事务
Redis中的事务是指提供一种将多个命令打包到一起,一次性按照顺序执行的机制。Redis在执行事务期间,不会接收处理其他操作命令。 Redis事务有以下局限性 无回滚机制:如果某个命令执行失败,不会影响其他命令的执行,因此…...
【PostgreSQL数据分析实战:从数据清洗到可视化全流程】3.3 异常值识别(Z-score法/IQR法/业务规则法)
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 PostgreSQL数据分析实战:数据质量分析之异常值识别(Z-score法 / IQR法 / 业务规则法)3.3 异常值识别3.3.1 Z-score法3.3.2 IQR法3.3.3 业…...