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

Linux动态库 vs 静态库:创建步骤与优缺点对比

Linux系列


文章目录

  • Linux系列
  • 前言
  • 一、动静态库的概念引入
    • 1.1 库的基本概念
    • 1.2 静态库(Static Library)
    • 1.3 动态库(Dynamic Library)
    • 1.4 动静态库的核心区别
  • 二、动静态库的实现
    • 2.1 静态库的创建及使用
    • 2.2 动态库的创建和使用
    • 三、优缺点对比
        • 静态库
        • 动态库
  • 总结


前言

在Linux系统开发中,静态库和动态库是我们经常使用的两种库文件类型,使用库文件进行开发工作,可以大大提高我们的开发效率,学习动静态库的差异及使用方式是我们熟练运用它的前提。
本篇文章我们将通过自己制作动静态库,来深入的学习动静态的使用、差异、原理。


一、动静态库的概念引入

在我们学习语言的过程中,不可避免的会使用库函数,那么它到底是什么呢?又是如何实现的呢?
接下来我们会慢慢回答这个问题。

1.1 库的基本概念

库是用来实现代码共享的,是预编译的代码集合(.o文件的集合),用来提供可复用的函数、类或数据,从而简化我们的开发过程提高开发效率,当我们使用库中的代码时只需要对库链接就可以使用。库又分为动态库和静态库两种类型,这两者各有其特点。

1.2 静态库(Static Library)

静态库通常由多个.o文件打包形成,以.a为后缀的文件集合。当可执行程序链接静态库时,在程序编译阶段会将使用到的,库中的程序所在的.o文件,全部嵌入至可执行文件中。

静态库的特点:

  • 文件编译时会将程序所用到的代码所在的.o文件全部嵌入至可执行文件中。
  • 每个可执行文件相对库来说是独立的(依赖代码已嵌入可执行文件)。
  • 不需要在程序运行时进行额外的文件加载。
  • 链接静态库会增加可执行文件的体积。
  • 库文件更新时需要重新编译所依赖该库的可执行文件。

1.3 动态库(Dynamic Library)

动态库比较复杂,我会在本片后面,及其后续文章不断补充相关知识

动态库是在程序运行时再加载的共享库,当程序执行时通过链接器与动态库建立关系,这个过程并不会发生拷贝。动态库同样是以多个.o文件打包的,以.so为后缀的文件集。

动态库的特点:

  • 程序运行时由操作系统动态加载、链接。
  • 一份被加载到内存的动态库,可被多个程序共享,减少了内存、磁盘的空间消耗。
  • 程序不需要额外内存,相较于链接静态库的可执行文件所占内存较小。
  • 更行动态库不需要重新编译可执行文件。

1.4 动静态库的核心区别

特性静态库 (.a)动态库 (.so)
链接方式编译时直接嵌入到可执行文件中运行时由动态链接器(如 ld-linux.so加载
文件体积可执行文件较大(包含库代码拷贝)可执行文件较小(仅记录引用)
内存占用每个进程独立加载库代码,内存冗余多个进程共享同一份库内存
更新维护需重新编译程序替换 .so 文件后立即生效
依赖管理无外部依赖,独立运行需确保运行时库路径正确
加载速度启动快(无需加载库)启动稍慢(需加载库)

静态库: 静态库的链接发生在可执行程序的编译时。编译器会将可执行文件中所涉及库中的代码,对应的.o文件嵌入到可执行文件中。
动态库: 动态库的链接发生在程序运行。动态库的链接会在程序启动时将动态库加载至内存的共享区,并库代码链接至可执行程序中(具体行为会在下篇文章中详细介绍)。

二、动静态库的实现

静态库和动态库本质都是.o文件的集合,只是在应用层两者的库文件的打包方式及访问方式存在差异,下面我们使用简单的代码,感受库的创建及使用,来深入学习。

在此过程中我们会以库的制作者和使用者两个视角来感受

2.1 静态库的创建及使用

代码部分:

  #pragma once   //防止头文件被重复包含                                                                                                                   #include<stdio.h>extern int myerrno;//标识该变量在源文件中已声明,具体作用可以搜一下int mydiv(int x,int y);

上面代码为mymath.h文件代码,学到这里我们就必须知道了,在我们编写代码时包含的.h文件(头文件)其实就是相当于库函数的一份说明书,内部并不存在具体函数实现。

  #include"mymath.h"int myerrno=0;int mydiv(int x,int y){                                                                                                                                 if(y==0){myerrno=1;//防止除0错误return -1;}return x/y;}

上述代码为mymath.c文件内容。

  1 static-lib=libmymath.a2 $(static-lib):mymath.o3     ar -rc $@ $^4 mymath.o:mymath.c5     gcc -c $^6 .PHONY:output7 output: 8    mkdir -p mylib/include9    mkdir -p mylib/lib10    cp *.h mylib/include11    cp *.a mylib/lib12 13 .PHONY:clear14 clear:15     rm -rf *.o *.a  mylib        

上面代码为Makefile文件内容,我来简单的解释一下:

2~3:使用ar -rc指令将.o文件打包成名为libmymath.a的静态库。

6~12:模拟库的发布,供使用者使用(Linux中也存在,存储库及头文件的目录)。

在这里插入图片描述
创建出我们的静态库并将库发布。

在这里插入图片描述
使用者将别人的库安装到自己所在路径。

   #include<mymath.h>int main(){int tmp=mydiv(10,1);printf("%d\n",tmp);return 0;}       

上面为main.c文件内容。
注意到了这里我们的库还是无法做到,像使用系统中的默认库那样使用,当你编译此文件时会发生链接错误,当我们的程序执行时找不到mymath.h的内容,这点很容易理解,他们都不在同一路径下,那么为什么c语言的库函数就可以直接编译呢?在Linux系统中,当我们在指向一个程序时,系统默认会去/usr/include/路径下寻找程序所包含的头文件,会去/lib64/路径下去找程序所需要的库文件,所以要想我们的库可以像c库一样被使用,只需将我们所写的libmymath.a库和mymath.h拷贝到上述系统路径即可,这里我们就不演示了,下面我们介绍另一种方法:

gcc 目标文件 -I 指定头文件搜索路径 -L 指定库文件搜索路径 -l指定链接库文件
gcc main.c -I mylib/include/ -L mylib/lib/ -lmymath

这里需要注意的是,当我们指定库文件是,只需要库文件名即可:lib库文件名.a。

在这里插入图片描述
程序成功编译并执行,此时a.out可执行文件中,已经嵌入一份mymath.o文件的数据了,即使你将库删除文件仍能执行,这里我就不演示了。

2.2 动态库的创建和使用

这里我们着重讲解两者不同的部分

代码部分:
mymethod.h文件内容:

  1 #pragma once2 #include<stdio.h>                                                                                                                 3 int print(char *str);    

mymethod.c文件的内容:

  1 #include"mymethod.h"2 3 int print(char *str)                                                                                                              4 {5   printf("%s\n",str);6   return 0;7 }

Makefile文件的内容:

  1 dy-lib=libmymethod.so2 $(dy-lib):mymethod.o3     gcc -shared -o $@ $^4 mymethod.o:mymethod.c5     gcc -fPIC -c $^6 .PHONY:output7 output: 8    mkdir -p mylib/include9    mkdir -p mylib/lib10    cp *.h mylib/include11    cp *.so mylib/lib12 .PHONY:clear13 clear:14     rm -rf *.o  *.so mylib        

2~3:将.o文件打包变为动态库,与静态库的打包方式不同。

4~5:将.c文件编译为.o文件
-fPIC:生成位置无关码,会在下篇介绍

接下来我们直接将库生成,并发布,以使用者角度再次探讨:

    1 #include<mymethod.h>2 3 int main()4 {                                                                                                                               5   print("abcdefg");6   return 0;7 }

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

现在我们使用程序链接静态库一样的方式,链接了动态库并生成了可执行文件,但是如果我们仅做了上面这些行为,生成的可执行程序还是无法执行,这是因为不同于静态链接的行为(将库嵌入到可执行文件),动态链接在链接时只是记录依赖关系,真正的加载是在原型时。所以即使用户在编译时正确指定了-L-l选项,生成的可执行文件在运行时仍然找不到动态库。

解决程序找不到动态库的方法:

1、将库文件和头文件拷贝到系统默认的库路径/lib64/usr/include下(系统默认链接搜索路径)。
2、在上述路径下与我们的库文件建立软连接(软连接的相关只是,上篇我们)。
3、将自己的库所在路径,添加到系统的环境变量LD_LIBRARY_PATH中。
4、在/etc/ld.so.conf.d路径下建立自己的动态路径的配置文件,然后重新ldconfig即可。

上述方法大家可以自己尝试,这里就不做展示了

三、优缺点对比

静态库
  • 优点
    • 无运行时依赖,部署简单。
    • 启动速度快(无需加载库)。
  • 缺点
    • 可执行文件体积大,浪费磁盘和内存。
    • 更新需重新编译,维护成本高。
动态库
  • 优点
    • 节省磁盘和内存资源。
    • 支持热更新(替换 .so 文件即可)。
  • 缺点
    • 依赖管理复杂(需设置 LD_LIBRARY_PATHrpath)。
    • 版本冲突风险(如 libfoo.so.1libfoo.so.2 不兼容)。

总结

本篇文章我们就介绍到这里,需要补充的是,gcc在编译程序时默认链接动态库,如果想要链接静态库可以使用-static显示指定。对于动态如如何实现共享,以及如何加载到内存这点我会在下篇介绍。

相关文章:

Linux动态库 vs 静态库:创建步骤与优缺点对比

Linux系列 文章目录 Linux系列前言一、动静态库的概念引入1.1 库的基本概念1.2 静态库&#xff08;Static Library&#xff09;1.3 动态库&#xff08;Dynamic Library&#xff09;1.4 动静态库的核心区别 二、动静态库的实现2.1 静态库的创建及使用2.2 动态库的创建和使用三、…...

分析下HashMap容量和负载系数,它是怎么扩容的?

很好&#xff0c;我们继续深入分析 HashMap 中 容量&#xff08;capacity&#xff09; 和 负载因子&#xff08;load factor&#xff09;&#xff0c;以及它是如何进行 扩容&#xff08;resize&#xff09; 的。 &#x1f9f1; 一、容量&#xff08;capacity&#xff09;与负载…...

Linux权限管理:从入门到实践

目录 引言 ​编辑一、Linux用户类型 二、文件访问者分类 三、文件类型和访问权限 &#xff08;一&#xff09;文件类型 &#xff08;二&#xff09;基本权限 四、文件访问权限设置方法 &#xff08;一&#xff09;chmod命令 &#xff08;二&#xff09;chown命令 &…...

计算机网络(1)

名称解析 名称解析&#xff1a;将名称解析成对应地址&#xff0c;名字-->IP 名称解析优点&#xff1a;便以记忆、解耦&#xff08;断开直接的练习&#xff09; 容器 mini的虚拟机&#xff0c;该容器地址是动态的、生命周期短暂&#xff1b;可实现登录功能 如果用户想要登录该…...

第十一天 - MySQL/SQLite操作 - 数据库备份脚本 - 练习:监控数据存储系统

数据库实战入门&#xff1a;从零构建监控数据存储系统 前言 在物联网和系统监控领域&#xff0c;数据存储是核心基础环节。本文将通过MySQL/SQLite操作、数据库备份脚本和监控数据存储实战三个模块&#xff0c;带领初学者快速掌握数据库在真实场景中的应用。文章包含25个代码…...

编写文生视频提示词,制作抖音爆款视频

编写文生视频提示词&#xff0c;制作抖音爆款视频 一、理解文生视频提示词1.1 定义提示词1.1.1 提示词与创作工具的关系1.1.2 文生视频的功能 1.2 提示词的组成1.2.1 主体&#xff08;Subject&#xff09;1.2.2 动作&#xff08;Action&#xff09;1.2.3 场景&#xff08;Scene…...

Linux: 线程控制

目录 一 前言 二 线程控制 1. POSIX线程库(原生线程库) 2. 创建线程 2.1 pthread_create 2.2pthread_self()获取线程id 3.线程终止 3.1.return 方式 3.2 pthread_exit 4 线程等待 三 理解线程tid 一 前言 在上一篇文章中我们已经学习了线程的概念&#xff0c;线程的创…...

为什么 npm list -g 没显示 node_modules?✨

揭秘&#xff1a;为什么 npm list -g 没显示 node_modules&#xff1f;&#x1f575;️‍♂️✨ 嗨&#xff0c;各位代码探险家&#xff01;&#x1f44b; 今天我们要破解一个 npm 小谜团&#xff1a;运行 npm list -g --depth0 时&#xff0c;为什么输出的路径里看不到 node_…...

华为数字芯片机考2025合集4已校正

单选 1. 题目内容 影响芯片成本的主要因素是 Die Size 和封装&#xff0c;但电源、时钟等因素&#xff0c;特别是功耗对解决方案的成本影响较大&#xff0c;因此低成本设计需要兼顾低功耗设计&#xff1a;&#xff08;&#xff09; 1. 解题步骤 1.1 分析题目 Die Size&…...

达摩院Paraformer-ONNX模型:一站式高精度中文语音识别工业级解决方案

文章目录 核心技术创新三大部署方案对比1. Docker极简部署&#xff08;推荐&#xff09;2. Python API直连调用3. 客户端实时测试工具 高阶调优技巧典型应用场景高频问题解决方案参考 阿里达摩院推出的speech_paraformer-large-vad-punc_asr_nat-zh-cn-16k-common-vocab8404-on…...

Llama 4的争议

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

React七案例下

代码下载 登录模块 用户登录 页面结构 新建 Login 组件&#xff0c;对应结构: export default function Login() {return (<div className{styles.root}><NavHeader className{styles.header}>账号登录</NavHeader><form className{styles.form}>&…...

Rust包管理与错误处理

文章目录 包管理箱&#xff08;Crate&#xff09;包&#xff08;Package&#xff09;模块&#xff08;Module&#xff09;访问权限use关键字 错误处理不可恢复错误可恢复错误错误传递kind方法 包管理 Rust的包管理有三个重要的概念&#xff0c;分别是箱、包、模块 箱&#xf…...

关于gitee的readme文档中的图片问题

使用markdown编辑readme文档&#xff0c;需要注意 添加图片&#xff0c;但是不显示问题 1.记得连图片一起上传到仓库中&#xff0c;不能只是在本地markdown文件中复制就结束了&#xff0c;因为存储的是本地图片地址&#xff0c;上传后找不到的 2.注意使用网络地址&#xff0…...

记录vscode连接不上wsl子系统下ubuntu18.04问题解决方法

记录vscode连接不上wsl子系统下ubuntu18.04问题解决方法 报错内容尝试第一次解决方法尝试第二次解决方法注意事项参考连接 报错内容 Unable to download server on client side: Error: Request downloadRequest failed unexpectedly without providing any details… Will tr…...

aws平台练习

注册 AWS 账户 访问 AWS 官方网站&#xff0c;点击“免费注册”按钮&#xff0c;按照提示完成账户注册&#xff1a; 提供电子邮件地址、密码和电话号码。 验证身份&#xff08;可能需要手机验证码&#xff09;。 设置 billing 信息。 2. 登录 AWS 管理控制台 使用注册的邮箱和…...

实战篇-梳理时钟树

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据 总结 前言 这是B站傅里叶的猫视频的笔记 一、建立工程 以Vivado的wave_gen为例子。为了引入异…...

【Hadoop入门】Hadoop生态之Hive简介

1 什么是Hive&#xff1f; 1.1 Hive概述 在大数据时代&#xff0c;如何让传统的数据分析师和SQL开发人员也能轻松处理海量数据&#xff1f;Hive应运而生。Hive是基于Hadoop构建的一套数据仓库分析系统&#xff0c;它提供了一种类似SQL的查询语言&#xff08;HQL&#xff09;&a…...

DSP复习【3章】

F2812提供了XINTF用于扩展并行接口的外设芯片。 XINTF&#xff08;外部接口&#xff09;所需的时钟是 SYSCLKOUT 和 XTIMCLK。 所以正确答案是&#xff1a; ✅ SYSCLKOUT 和 XTIMCLK 什么是XREADY信号&#xff0c;如何使用&#xff1f; 章节例题&#xff1a; 1. 如何通过软件判…...

Hadoop案例——流量统计

Hadoop案例——流量统计 在大数据时代&#xff0c;流量统计是许多企业和组织的关键需求之一。通过分析网络流量数据&#xff0c;企业可以优化网络资源分配、提升用户体验、制定精准的营销策略等。本文将介绍如何使用 Hadoop 框架实现一个简单的流量统计案例&#xff0c;包括数…...

Linux管道 有名管道(FIFO)工作机制全解:从理论到实践

有名管道&#xff08;重要&#xff09; 有名管道/命名管道&#xff0c;主要用于没有血缘关系进程间的通信 当然也支持有血缘关系的情况&#xff0c;只是如果有血缘关系&#xff0c;没有必要使用有名管道&#xff0c;无名管道效果更佳 引入 好了&#xff0c;现在使用条件有了…...

java基础-修饰符

java修饰符 修饰符分类访问修饰符的作用域代码说明访问修饰符总览 非访问修饰符staticfinalabstractsynchronizedvolatiletransientnativestrictfp非访问修饰符总览表 非访问修饰符组合与冲突规则 修饰符分类 分类&#xff1a;访问修饰符 和 非访问修饰符 1.访问修饰符 公共…...

解锁基因密码之重测序(从测序到分析)

在生命科学的奇妙世界中&#xff0c;基因恰似一本记录着生命奥秘的“天书”&#xff0c;它承载着生物体生长、发育、衰老乃至疾病等一切生命现象的关键信息。而重测序技术&#xff0c;则是开启基因“天书”奥秘的一把神奇钥匙。 试想&#xff0c;你手中有一本经典书籍的通用版…...

当使用 Docker Desktop 启动 Tomcat 镜像时时间不对

当使用 Docker Desktop 启动 Tomcat 镜像时时间不对&#xff0c;可能由以下原因导致并可采取相应解决方法&#xff1a; 宿主机时间设置问题&#xff1a;Docker 容器的时间是由宿主机提供的&#xff0c;如果宿主机的时间不正确&#xff0c;那么容器的时间也会不正确。需确保宿主…...

golang gmp模型分析

思维导图&#xff1a; 1. 发展过程 思维导图&#xff1a; 在单机时代是没有多线程、多进程、协程这些概念的。早期的操作系统都是顺序执行 单进程的缺点有&#xff1a; 单一执行流程、计算机只能一个任务一个任务进行处理进程阻塞所带来的CPU时间的浪费 处于对CPU资源的利用&…...

Redisson的RedLock与联锁(MultiLock)的区别

Redisson提供了两种分布式锁机制&#xff1a;RedLock(红锁)和MultiLock(联锁)&#xff0c;它们在实现分布式锁时有重要区别。 1. RedLock (红锁) 设计原理&#xff1a; 基于Redis官方提出的Redlock算法实现目的是在Redis集群环境下提供更可靠的分布式锁需要至少3个独立的Redi…...

图灵逆向——题十-魔改算法

目录列表 过程分析JS代码还原代码实现运行结果 本题属于魔改标准加密算法&#xff0c;所以无法使用JS或Python中的标准库来进行模拟加密了&#xff0c;只能一步一步的还原它的环境咯。。。 过程分析 打开控制台发现有个无限debugger&#xff0c;直接过掉~[doge]。。。 OK过掉…...

K8S学习之基础七十九:关闭istio功能

关闭istio功能 kubectl get ns --show-labels kubectl label ns default istio-injection-有istio-injectionenabled的命名空间&#xff0c;pod都会开启istio功能 反之&#xff0c;如果要开启istio&#xff0c;在对应命名空间打上该标签即可...

AI大模型课程系列汇总-某客时间篇

某客时间系列篇章&#x1f4a5; NO.文章&#xff08;点击可跳转&#xff09;1【课程系列11】某客时间AI 大模型应用开发实战营_ai大模型应用开发实战营 百度云-CSDN博客2【课程系列12】某客时间AI大模型微调训练营_极客时间 大模型rag 网盘-CSDN博客3【课程系列15】2024某客时…...

【人工智能】大语言模型多义词解析技术揭秘——以“项目“歧义消解为例

今天田辛老师和小伙伴探讨了一个有趣的多义词问题&#xff0c; 在人工智能技术日新月异的今天&#xff0c;大语言模型&#xff08;LLM&#xff09;对自然语言的理解能力已经达到令人惊叹的水平。大模型到底是如何去区分多义词的&#xff1f; 比如&#xff1a;当用户提到"…...

Coze平台 发布AI测试Agent的完整实现方案

以下是基于 Coze平台 发布AI测试Agent的完整实现方案,包含架构设计、核心功能模块、集成方式和落地步骤: 一、方案架构图 #mermaid-svg-kzS7cltxrbetjROl {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-kzS7cltxr…...

OpenHarmony子系统开发 - 调测工具(二)

OpenHarmony子系统开发 - 调测工具&#xff08;二&#xff09; 三、hiperf使用指导 hiperf是为开发人员提供性能采样分析的工具&#xff0c;基于内核perf机制进行的用户态能力的扩展&#xff0c;可以对指定的程序或者整个系统进行性能采样。 hiperf支持的命令有&#xff1a;l…...

keil ERROR: L6220E 如何解决

最近调试MK8000方案&#xff0c;增加code后遇到&#xff1a; keil ERROR: L6220E: Execution region RW_RAM1 size (24592 bytes) execeeds limit (24568 bytes) .region contains 93 bytes of padding and 0 bytes of veneers (total 93 bytes of linker generated content) …...

c++比较器——priority_queue用 ; unordered_map 自定义哈希函数

文章目录 priority_queue自定义比较方法对 比较对象结构体 重载 <仿函数为什么是传一个类std::less<T> 和 std::greater<T> lambda unordered_map自定义哈希函数仿函数lambda priority_queue template<class T,class Container std::vector<T>,class…...

centos-LLM-生物信息-BioGPT安装

参考&#xff1a; GitHub - microsoft/BioGPT https://github.com/microsoft/BioGPT BioGPT&#xff1a;用于生物医学文本生成和挖掘的生成式预训练转换器 |生物信息学简报 |牛津学术 — BioGPT: generative pre-trained transformer for biomedical text generation and mini…...

esp32cam远程图传:AI Thinker ESP32-CAM -》 服务器公网 | 服务器 -》 电脑显示

用AI Thinker ESP32-CAM板子访问公网ip的5112端口并上传你的摄像头拍摄的图像视频数据&#xff0c;并写一段python程序打开弹窗接受图像实现超远程图像传输教程免费 1. 首先你要有一个公网ip也就是去买一台拥有公网的服务器电脑&#xff0c;我买的是腾讯云1年38元的服务器还可…...

今日踩坑之@Autowired与@Resource区别

案例说明 今天算是体验到了这俩注解的区别了&#xff0c;真所谓不报错就记不住这两注解区别&#xff0c;其实之前本人也是知道这俩注解的区别的只是我们往往项目上用习惯了Autowired就忘了&#xff0c;看来只有真正体会到报错才能记忆犹新o(╥﹏╥)o。 说明一下本人的踩坑情况&…...

在 M1 芯片的 Mac 电脑上安装 Redis 可以通过 ​​Homebrew​​ 快速完成

以下是详细步骤&#xff1a; 1. 安装 Homebrew&#xff08;若未安装&#xff09; 打开 ​​终端​​&#xff0c;执行以下命令安装 Homebrew&#xff08;已安装可跳过&#xff09;&#xff1a; /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/…...

【从零开始学习JVM | 第一篇】快速认识JVM

什么是JVM&#xff1f; JVM--Java虚拟机&#xff0c;它是Java实现平台无关性的基石。 Java程序运行的时候&#xff0c;编译器将Java代码编译为平台无关的Java字节码文件&#xff08;.class&#xff09;&#xff0c;接下来对应平台的JVM对字节码进行运行解释&#xff0c;翻译成…...

linux 里的创建了一个tomcat用户 怎么禁止该用户使用crontab 功能

在 Linux 系统中&#xff0c;可以通过以下方法禁止 tomcat 用户使用 crontab 功能&#xff1a; 方法 1&#xff1a;通过 /etc/cron.deny 文件限制 这是 最推荐的标准方法&#xff0c;适用于所有主流 Linux 发行版&#xff08;CentOS、Ubuntu 等&#xff09;。 操作步骤&#…...

Elasticsearch入门指南(二)

一、RestClient操作索引库 什么是RestClient&#xff1f; ES官方提供了各种不同语言的客户端&#xff0c;用来操作ES。这些客户端的本质就是组装DSL语句&#xff0c;通过http请求发送给ES。官方文档地址&#xff1a; https://www.elastic.co/guide/en/elasticsearch/client/in…...

Mac监控新风尚:酷炫界面,性能监控更直观!

你是否曾经希望自己的Mac能够像Windows那样&#xff0c;轻松一按就能查看任务管理器来监控性能状态呢&#xff1f; 对于Mac用户来说&#xff0c;系统性能监控一直是个挑战——苹果公司并没有提供一个直观的性能监控工具&#xff0c;用户往往需要通过复杂的活动监视器来获取这些…...

碰一碰发视频源码开发深度解析,定制化开发

在移动应用开发领域&#xff0c;便捷的数据分享功能始终备受关注。碰一碰发视频这一创新功能&#xff0c;借助近场通信&#xff08;NFC&#xff09;技术&#xff0c;为用户提供了一种快速、直观的视频分享体验。本文将深入剖析碰一碰发视频功能的源码开发过程&#xff0c;涵盖从…...

基于 AI智能体、大模型、RAG、Agent 等技术构建公司内部闭环智能问答系统的详细方案,结合 Spring Boot + Vue 管理系统 的改造思路

以下是基于 AI智能体、大模型、RAG、Agent 等技术构建公司内部闭环智能问答系统的详细方案&#xff0c;结合 Spring Boot Vue 管理系统 的改造思路&#xff1a; 1. 系统架构设计 核心组件 数据源层 内部文档库&#xff1a;公司知识库&#xff08;如操作手册、FAQ、流程文档&a…...

红宝书第三十四讲:零基础学会单元测试框架:Jest、Mocha、QUnit

红宝书第三十四讲&#xff1a;零基础学会单元测试框架&#xff1a;Jest、Mocha、QUnit 资料取自《JavaScript高级程序设计&#xff08;第5版&#xff09;》。 查看总目录&#xff1a;红宝书学习大纲 一、单元测试是什么&#xff1f; 就像给代码做“体检”&#xff0c;帮你检查…...

视觉分析AI赋能智慧水务多场景应用

利用视觉分析的方式智慧水务的AI算法方案 一、背景 在传统水务监管中&#xff0c;面临着诸多痛点。例如&#xff0c;对于河道污染、水面异常、河湖四乱问题以及水生态环境差等情况&#xff0c;传统监管效率低下&#xff0c;预警不及时&#xff0c;资源分散&#xff0c;监控功…...

网络2 IP与MAC IP地址

IP地址与MAC地址 一 1.关系&#xff1a; 网卡有唯一的物理地址&#xff1a;MAC地址&#xff0c;IP是配置在网卡上的逻辑地址。 IP地址、MAC地址是进行网络通信必不可少的 2.MAC地址是物理地址&#xff0c;不可更改&#xff0c;通常与IP地址绑定 3.MAC地址&#xff1a;48位 IP地…...

spark-Core

运行架构 核心组件 由上图可以看出&#xff0c;对于 Spark 框架有两个核心组件&#xff1a; Driver&#xff0c;Spark 驱动器节点 其中Spark 驱动器节点&#xff0c;用于执行 Spark 任务中的 main 方法&#xff0c;负责实际代码的执行工作。 Driver 在 Spark 作业执行时主要…...

前端开发中的问题排查与定位:HTML、CSS、JavaScript(报错的解决方式)

目录 1.html 1. 结构错误调试&#xff1a;标签未正确嵌套 2. 语法问题调试&#xff1a;缺失引号 3. 断点调试&#xff1a;动态生成内容时的 JavaScript 错误 4. 网络调试&#xff1a;资源加载错误 5. 性能调试&#xff1a;页面加载性能 总结&#xff1a; 2.CSS 1. 定位…...

VMware Fusion Pro 13 for Mac虚拟机

VMware Fusion Pro 13 for Mac虚拟机 文章目录 VMware Fusion Pro 13 for Mac虚拟机一、介绍二、效果下载 一、介绍 VMware Fusion Pro for Mac&#xff0c;是一款mac虚拟机软件&#xff0c;跟Parallels Desktop一样&#xff0c;都可以让你的 Mac 同时运行一个或多个不同的操作…...