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

Linux软硬链接和动静态库(20)

文章目录

  • 前言
  • 一、软硬链接
    • 基本认知
    • 实现原理
    • 应用场景
    • 取消链接
    • ACM时间
  • 二、动静态库
    • 认识库
    • 库的作用
  • 三、制作静态库
    • 静态库的打包
    • 静态库的使用
  • 四、制作动态库
    • 动态区的打包
    • 动态库的链接与使用
    • 动态库的链接原理
  • 总结


前言

在这里插入图片描述

  我有款非常喜欢玩的游戏,叫做《饥荒》,现在我下载了这一款游戏,但我不会跑到游戏所在目录中双击 .exe 打开游戏,大多数人都会通过桌面的快捷方式直接打开文件,而这个快捷方式实际就是对 .exe 的 软链接 文件; 当你在游戏中加载地图、道具等资源时,这些数据是存在 .exe 文件中的吗? 答案是当然不是,这些资源文件都以 库 的方式与 .exe 位于同一目录中,通常为动态库,在 Windows 中后缀为 dll,那么这些神奇的辅助文件是如何产生的? 其本质又是如何?本篇将带你一起揭晓。

另外还有一个小要求,请先回顾一下我上篇文章的 inode 这个概念,这在本篇仍很重要


一、软硬链接

基本认知

对文件进行软链接

ln -s file.txt file-soft.link

对文件进行硬链接

ln file.txt file-hard.link

源文件,软链接文件,硬链接文件如下:
在这里插入图片描述

注意: 可以对目录进行软链接,但不能对目录进行硬链接,具体原因后面再解释

  那么生成的软硬链接有什么用呢?

  像源文件一样使用即可,结果一模一样(因为当前软硬链接的都是同一个源文件)
在这里插入图片描述
同时我们发现这两种链接方式其本质上是有很大差别的:

  1. 软链接文件的 inode 编号与源文件不同(独立存在),软链接文件比源文件小得多,并且 软连接文件 -> 源文件
  2. 硬链接文件与源文件共用一个 inode 编号(对源文件其别名),硬链接文件与源文件一样大,并且硬链接文件与源文件的链接数变成了 2

软链接文件依赖于源文件,而硬链接文件是源文件的别名

当我们将源文件删除后,软链接失效; 硬链接仍然有效,不过硬链接数变为了 1
在这里插入图片描述

  同样是对源文件进行链接,为何两种链接方式差别如此大呢? 这就不得不谈一下它们的实现原理了

实现原理

  软链接又称为符号链接,它是一个单独存在的文件,拥有属于自己的 inode 属性及相应的文件内容,不过在软链接的 Data block 中存放的是源文件的地址,因此软链接很小,并且非常依赖于源文件

  在这里以QQ为例,可以看到快捷方式(软链接方式)中存放的是源文件的地址

在这里插入图片描述
  因此如果源文件被删除了,那么在执行软连接文件时,其中的地址就是一个无效地址(目标文件已丢失),此时就会报错 No such file or directory

  假设只是单纯的删除软连接文件,那么对源文件的内容没有丝毫影响,就好比 桌面上的快捷方式,有的人以为将快捷方式(软链接)文件删除了,就是在 “卸载” 软件,其实不是,如果想卸载软件,直接将其源文件相关文件夹全部删除即可

有多少人到现在还有误解呢?

  硬链接并非创建一个相同的文件进行链接,而是在源文件所目录下的 (inode编号 & 文件名) 对应表中,新增 inode 编号与 硬链接文件名 的映射关系,并将 inode 结构体中的引用计数 +1,表示当前已成功硬链接上了一个文件
在这里插入图片描述
  当删除当前 对应文件时,会 先判断 ref_count 是否为 1,如果是,才会将文件内容及其属性真正删除,否则删除的只是 文件名 与 inode 编号的映射关系inode

  这也就解释了为什么删除源文件后,硬链接文件不受任何影响,仅仅只是 硬链接数 - 1,同理,删除硬链接文件,也不会影响源文件

  为什么新建目录的硬链接数为 2 ?

  1. 因为一个目录在新建后,其中默认存在两个隐藏文件:. 与 …
  2. 其中 . 表示当前目录,… 表示上级目录

  Linux 中的目录结构为多叉树,即当前节点(目录)需要与父节点(上级目录)、子节点(下级目录)建立链接关系,并且还得知道当前目录的地址,否则就会导致切换目录时出现错误

在这里插入图片描述
  为了避免因用户的误操作而导致的目录环状问题,规定用户不能手动给目录建立硬链接关系,只能由 OS 自动建立硬链接,比如新目录后,默认与上级目录和当前目录建立硬链接文件,在当目录下创建新目录后,当前目录的硬链接数 + 1

所以说,将目录的硬链接数 - 2 ,得到的数字就是该目录下的目录数

在这里插入图片描述

  4 - 2 = 2,所以目录 gitQuest 下一共有2个目录,我们来验证一下:
在这里插入图片描述

应用场景

  软链接可以当作快捷方式使用,比如快速运行一个藏的很深的可执行程序
在这里插入图片描述
  而硬链接一是可以用来当作目录移动的工具二是可以用来给重要的源文件起别名并使用,一旦发生删除等不可逆行为时,可以确保源文件的安全

  注意: 硬链接并不是将源文件直接进行备份,而是新建立 inode 编号与硬链接文件名的映射关系,同时 struct inode 中的引用计数 ref_count++,只有当 ref_count == 1 时才会真正删除文件内容及属性, 否则都只是在取消映射关系和 ref_count–

取消链接

取消链接的方式有两种:

  1. 直接删除链接文件
  2. 通过 unlink 取消链接关系

ACM时间

  每一个文件都有三个时间:访问 Access、修改属性 Change、修改内容 Modify,简称为时间ACM

  可以通过 查看指定文件的 时间信息 statACM

在这里插入图片描述
这三个时间的刷新策略如下:

  • Access:最近一次查看内容的时间,具体实现取决于系统
  • Change:最近一次修改属性的时间
  • Modify:最近一次修改内容的时间(内容更改后,属性也会跟着修改)

  Access 是高频操作,如果每次查看都更新的话,会导致 效率变低,因此 实际变化取决于刷新策略:查看 N 次后刷新IO

  注意: 修改内容一定会导致属性时间被修改,但不一定会导致访问时间被修改,因为可以不打开文件,对文件进行操作

二、动静态库

认识库

常见的库文件:stdio.h stdlib.h string.h等

库分为 动态库 和 静态库

  • Linux 中,.a 后缀为静态库,.so 后缀为动态库
  • Windows 中,.lib 后缀为静态库,.dll 后缀为动态库
  • 虽然不同环境下的后缀有所不同,但其工作原理是一致的

库命名

  • 比如 libstdc++.so.6
  • 去掉前缀跟后缀,最终库名为 stdc++

  查找当前环境的库文件:

find /usr/lib64/libc*

在这里插入图片描述

  C++ 中具体库文件可以这样查看:

find /usr/lib64/libstdc*

在这里插入图片描述
  在编写程序时,一定离不开库文件,动态库优势比静态库明显,因此在编译代码时,默认采用动态链接的方式,如果想指定为静态链接编译,只需要在 gcc/g++ 语句后面加上 -static 即可(前提是得有静态库)

  关于动静态库的优缺点可以看看下面这个表格

区别动态库静态库
调用方式通过函数位置进行调用直接将需要的函数拷贝至程序中
依赖性(运行时)需要依赖于动态库可以独立于静态库运行
空间占用共享动态库中的代码,空间占用少拷贝代码会占用大量空间
加载速度调用函数,加载速度慢直接运行,加载速度快

  注意: 静态库是将所需要的函数代码拷贝到源文件中直接使用,而动态库是通过动态链接的方式,进行函数链接使用,别急,这个我们后面会再细细讲解

库的作用

  • 提高开发效率
  • 头和库是有对应关系的,需要组合使用
  • 头文件在预处理阶段就已经引入了,链接的本质就是在链接库

  简言之,如果没有库文件,那么你在开发时,需要自己手动将 等高频函数编写出来,因此库文件可以提高我们的开发效率,比如 中就有很多现成的库函数可以使用,效率很高,如:printf

我们在IDE环境下编码的时候,语法提示是如何做到的?

  1. 安装开发环境,实际上是在安装编译器、开发语言配套的库和头文件
  2. 编译器的 语法提示功能来源于头文件(语法提示其实就是搜索)

我们在写代码时,开发环境是怎么知道语法错误或其他错误的?

  1. 编译器有命令行模式,还有其他自动化模式,编写代码时,不断进行主动编译,排查错误

三、制作静态库

  现在有一些简单的计算 函数,能满足整型的 计算

在这里插入图片描述
  主函数中将对这些自定义的库函数进行调用
在这里插入图片描述

静态库的打包

  一共分为两步:

  1. 将源文件进行 预处理 -> 编译 -> 汇编,生成可链接的二进制 .o 文件
  2. 通过指令将 .o 文件打包为静态库

  将文件编译为 .o 二进制文件

gcc -c add.c sub.c

  将所有的 .o 文件打包为一个静态库(库名自定义),其中的 为库名mycalc

ar -rc libmycalc.a *.o

ar -tv 静态库文件
该指令可以查看打包的库文件
在这里插入图片描述

  获得静态库后,就可以进行使用了

静态库的使用

方法一:通过指定路径使用静态库

  如果直接编译程序,会出现编译失败的情况,因为编译器不认识第三方库(需要提供第三方库的路径及库名)

在这里插入图片描述

第一方库:语言提供
第二方库:操作系统提供
第三方库:other 提供的库,比如当前我们直接打包的静态库

对于自己写的的第三库的使用,需要标注三个参数:

  • -I 所需头文件的路径 需要将所需头文件的路径加上,此处为 ./stdc/include
  • -L 所需库文件的路径 这里加的是库文件的路径,也为 ./stdc/lib
  • -l 待链接静态库名 所需要链接的静态库名字,这里为 libmycalc.a

将选项加上后重新编译
在这里插入图片描述
在这里插入图片描述

方块二:将头文件和静态库文件安装至系统目录中

  除了这种比较麻烦的指定路径编译外,我们还可以将头文件与静态库文件直接安装在系统目录中,直接使用,无需指定路径(需要指定静态库名)

  所谓的安装软件,就是将自己的文件安装到系统目录下

sudo cp ./stdc/include/*.h /usr/include/
sudo cp ./stdc/lib/*.a /lib64/

在这里插入图片描述

  注意: 将自己写的文件安装到系统目录下是一件危险的事(导致系统环境被污染),用完后记得手动删除

在这里插入图片描述

四、制作动态库

动态区的打包

  动态库不同于静态库,动态库中的函数代码不需要加载到源文件中,而是通过 与位置无关码 ,对指定函数进行链接使用

动态库的打包也同样分为两步:

  1. 编译源文件,生成二进制可链接文件,此时需要加上 -fPIC 与位置无关码
  2. 通过 gcc/g++ 直接目标程序(此时不需要使用 ar 归档工具)

  将源文件编译为 .o 二进制文件,此时需要带上 fPIC 与位置无关码
在这里插入图片描述
  将所有的 .o 文件打包为动态库(借助 gcc/g++)

gcc -o libmycalc.so *.o -shared

  获得动态库后,就可以进行使用了
在这里插入图片描述

动态库的链接与使用

  像使用静态库一样使用动态库(指定路径及库名),编译成功,但运行失败!

  为什么会出现这种问题? 因为当前只告诉了编译器动态库的位置,没有告诉 OS

通过 查看程序链接情况:ldd
在这里插入图片描述
运行时, 是如何链接动态库?OS

  1. 环境变量 LD_LIBRARY_PATH (默认没有这个环境变量),将第三方动态库路径添加至此环境变量中(临时方案)
  2. sudo 在 /lib64/ 目录下建立动态库的软链接
  3. 更改配置文件 /etc/ld.so.conf.d 这个目录中都是各种动态库配置文件,创建文件 xx.conf 至目录中(文件中存储的是第三方动态库的路径)ldconfig 令配置文件生效

方法一:通过环境变量解决

  添加动态库路径至 环境变量中LD_LIBRARY_PATH

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:路径

  环境变量 是程序在进行动态库查找时的默认搜索路径LD_LIBRARY_PATH

注意: 更改环境变量只是临时方案,重新登录后会失效

方法二:将动态库的软链接文件存入系统目录中

sudo ln -s 路径 /lib64/libmycalc.so

  注意: 创建软连接文件时,需要使用绝对路径!

方法三:更改配置文件中的信息

echo 路径 > lhq.conf
sudo mv lhq.conf /etc/ld.so.conf.d/
sudo ldconfig # 手动更新

  注意: 后两种方法都可以做到永久生效(因为存入了系统目录中),但在使用完后最好删除,避免污染系统环境

动态库的链接原理

  程序在链接动态库函数时,是通过 动态库起始地址 + 所链接函数偏移量 的方式进行链接访问的,而这个偏移量就是 fPIC 与位置无关码

  地址其实就两种:绝对地址和相对地址,静态链接时,将可链接的二进制文件加载至程序中,直接通过 绝对地址 进行链接,假设函数被调用了多次,就会导致代码冗余等问题; 动态链接采用 相对地址 的方式进行链接,同一个函数的 + 值相同,代码只需要加载一份,并且可以任意位置进行函数调用(与位置无关)动态库起始地址所链接函数偏移量

在这里插入图片描述

  动态库中所有地址都是偏移量,默认从 开始0

  只有当一个库被真正映射进地址空间后,它的起始地址才能真正确定

  • 链接库中的函数时,通过 动态库的起始地址 + 函数偏移量 的方式链接函数
  • 这种方法不论在什么位置,都可以随便链接函数(与位置无关)
  • 与位置无关码:动态库中地址,是偏移量

总结

最后还有需要总结的一些要点就是:

  1. 当同时拥有 静态库 和 动态库 时,默认采用动态链接
  2. 可以在编译的时候最后加上 -static 指定 静态链接
  3. 只有静态库,又不指定静态链接,这个时候是动态链接(内含静态库)
  4. 静态链接生成的程序比动态链接大得多,并且内含静态库的动态链接程序,也比纯粹的动态链接程序大,程序并非非静即动

  另外,你可不可以利用 Makefile 来简化步骤?

相关文章:

Linux软硬链接和动静态库(20)

文章目录 前言一、软硬链接基本认知实现原理应用场景取消链接ACM时间 二、动静态库认识库库的作用 三、制作静态库静态库的打包静态库的使用 四、制作动态库动态区的打包动态库的链接与使用动态库的链接原理 总结 前言 我有款非常喜欢玩的游戏,叫做《饥荒》&#xf…...

FX10(CYUSB4014)USB3.2(10Gbps)开发笔记分享(1):硬件设计与开发环境搭建

作者:Hello,Panda 大家早上好,中午好,下午好,晚上好,熊猫君又来了。这次计划做一个连载,大概6期左右,主要介绍英飞凌最新的FX5/10/20的器件应用。目前,熊猫君手上调试的…...

【工具变量】上市公司-“链主“企业相关数据(2001-2024年)

上市公司的"链主企业"(Anchor Enterprise)指在其供应链中具有较较高中心度的公司。这些公司通过其规模、技术优势、资源整合能力等,影响和带动整个产业链的发展与运作。这些企业往往是供应链中最重要的节点,其决策和行为…...

Qt知识点1『16进制数值与文本互相转换』

工作中可能会遇到QByteArray保存着16进制的数据,例如网络传输中的数据在抓包软件下就会显示为16进制的文本格式。本次是在串口通讯首发消息时遇到的这类转换问题,做一下记录。 一、16进制的文本字符串如何转换数值 解决:形如QString("0…...

MongoDB Shard Cluster

# MongoDB Shard Cluster 集群规划 132上面单独安装mongos 在 1,2,3上面安装shard1和config 在 4,5,6上面安装shard2 节点host如下 172.20.192.20 member1.blockin.ai 172.20.192.21 member2.blockin.ai 172.20.192.31 member3.blockin.ai …...

Pycharm(六):可变与不可变类型

一、引用 在java中既有值传递,也有引用传递,我们思考一下在python中值的传递方式是哪种类型呢? 答案是引用传递。 概述: Python中存储变量是需要占用内存空间的,为了更好地管理这些空间,每块空间都是有自己的地址值的。 格式: id(变量名/值) 可以查看变量/…...

每日算法-250425

每日算法打卡 - 2025年4月25日 记录今天完成的几道 LeetCode 算法题,分享解题思路和代码。 2178. 拆分成最多数目的正偶数之和 题目 解题思路 贪心算法 解题过程 题目要求我们将一个偶数 finalSum 拆分成尽可能多的 不同 正偶数之和。 为了使拆分出的数字数量…...

github把自己的jar包发送到maven中央仓库

maven中央仓库注册账号 《Maven中央仓库官网》 注册账号 直接使用github账号 他会自动帮我们创建一个github的命名空间 获取自己的User Token 切记立马复制、保存username和password,后面maven的settings.xml会用到,因为这个页面会在一分钟以后自动关闭…...

链表系列一>两两交换链表中的结点

目录 题目:解析:代码: 题目: 链接: link 解析: 代码: /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int va…...

【深度强化学习 DRL 快速实践】异步优势演员评论员算法 (A3C)

Asynchronous Advantage Actor-Critic A3C (2016, DeepMind) 异步优势演员评论员算法 (A3C): 继承 actor-critic 的优势,同时通过异步多线程 (团队作战) 加速了训练过程 model-free, actor-critic 核心改进点说明异步并行训练 – Asynchronous (无经验回放)通过多个…...

240425 leetcode exercises

240425 leetcode exercises jarringslee 文章目录 240425 leetcode exercises[147. 对链表进行插入排序](https://leetcode.cn/problems/insertion-sort-list/)🔁插入排序 [1721. 交换链表中的节点](https://leetcode.cn/problems/swapping-nodes-in-a-linked-list…...

找三维gis开发的工作,Mapbox要学到什么程度?

Mapbox 是⼀个可以创建各种⾃定义地图的⽹站,如 Pinterest、Evernote、Github、500px 等⼤牌都使⽤ Mapbox 创建⾃⼰的地图,Mapbox 宣称要构建世界上最漂亮的地图。已为 Foursquare、Pinterest、Evernote、⾦融时报、天⽓频道、优步科技 等公司的⽹站提供…...

ThinkPHP6模型中多组条件逻辑或Or查询的使用

直接进入正题&#xff0c;如我们的查询条件是这样的&#xff1a; (age > 20 and job_id 3) or (sex 1 and age < 20) 上面两组数据之间是 Or 的关系。 可使用两个闭包进行查询&#xff0c;代码如下&#xff1a; $map1 [age > 30,sex > $id,];$map2 …...

《AI大模型趣味实战》基于RAG向量数据库的知识库AI问答助手设计与实现

基于RAG向量数据库的知识库AI问答助手设计与实现 引言 随着大语言模型&#xff08;LLM&#xff09;技术的快速发展&#xff0c;构建本地知识库AI问答助手已成为许多企业级应用的需求。本研究报告将详细介绍如何基于FLASK开发一个使用本地OLLAMA大模型底座的知识库AI问答助手&…...

netcore8.0项目发布到centos,利用nginx反向代理(宝塔面板篇)

1、发布netcore项目 在program.cs中配置nginx代理 // 添加Nginx反向代理支持 builder.Services.Configure<ForwardedHeadersOptions>(options > {options.ForwardedHeaders ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;options.KnownNetwo…...

项目笔记1:通用 Service的常见方法

通用 Service 通常封装了常见的业务逻辑操作&#xff0c;以提高代码的复用性和可维护性。不同的框架和业务场景下&#xff0c;通用 Service 的方法会有所差异&#xff0c;但一般都会包含一些基本的增删改查&#xff08;CRUD&#xff09;操作&#xff0c;以下为你详细介绍&#…...

VUE3父子组件defineModel动态值获取及处理

需求&#xff1a;子组件获取父组件value值时需处理&#xff0c;子组件加载时用onMounted&#xff0c;value变化时用watch 父组件&#xff1a; <template><div><p>父组件的值: {{ parentValue }}</p><button click"changeValue">改变…...

CUDA编程之Grid、Block、Thread线程模型

一、线程模型:Grid、Block、Thread概念 ‌1. 层级定义‌ ‌Thread(线程)‌ CUDA中最基本的执行单元,对应GPU的单个CUDA核心(SP)。每个线程独立执行核函数指令,拥有独立的寄存器和局部内存空间‌。 ‌Block(线程块)‌ 由多个线程组成(通常为32的倍数),是逻辑上的并…...

BT151-ASEMI无人机专用功率器件BT151

编辑&#xff1a;ll BT151-ASEMI无人机专用功率器件BT151 型号&#xff1a;BT151 品牌&#xff1a;ASEMI 封装&#xff1a;TO-220F 批号&#xff1a;最新 引脚数量&#xff1a;3 特性&#xff1a;单向可控硅 工作温度&#xff1a;-40℃~150℃ ‌BT151单向可控硅产品解…...

无人机环境适应性与稳定性技术要点!

1. 环境感知与传感器融合 多传感器集成&#xff1a;结合IMU&#xff08;惯性测量单元&#xff09;、GPS、气压计、激光雷达&#xff08;LiDAR&#xff09;、视觉传感器&#xff08;RGB/深度相机&#xff09;、超声波等&#xff0c;实现冗余数据采集。 实时环境建模&#xff1…...

BiliNote:开源的AI视频笔记生成工具,让知识提取与分享更高效——跨平台自动生成结构化笔记,实现从视频到Markdown的智能转化

引言:视频学习的痛点与BiliNote的解决方案 随着知识视频化趋势的加速,B站、YouTube等平台成为学习与信息获取的重要渠道,但手动记录笔记耗时低效、信息碎片化等问题依然突出。BiliNote的出现,通过AI驱动的自动化流程,将视频内容转化为结构清晰的Markdown笔记,支持截图插…...

HTMLcss实现网站抽奖

代码由 HTML、CSS 和 JavaScript 三部分组成&#xff0c;HTML 负责页面的结构搭建&#xff0c;CSS 负责页面的样式设计&#xff0c;JavaScript 负责实现抽奖的交互逻辑。 HTML 部分 <!DOCTYPE html> <html lang"en"><head><meta charset"…...

字节:视频一致性生成论文速读

一、引言 Phantom: Subject-Consistent Video Generation via Cross-Modal Alignment 是北京字节跳动智能创作团队提出的一种新型视频生成方法&#xff0c;旨在解决主体一致性视频生成的难题。该方法通过平衡文本和图像的双重模态提示&#xff0c;实现文本和视觉内容的深度对齐…...

JAVA常用分布式锁Redisson

1. 加锁过程 底层命令与数据结构 Redis 数据结构&#xff1a;使用 Hash 结构存储锁信息&#xff0c;Key 为锁名称&#xff0c;Field 为客户端唯一标识&#xff08;如 UUID 线程ID&#xff09;&#xff0c;Value 为锁的重入次数。 Lua 脚本原子性&#xff1a;通过 Lua 脚本在…...

9.ArkUI List的介绍和使用

ArkUI List 组件详解与使用指南 List 是 ArkUI&#xff08;HarmonyOS 开发框架&#xff09;中用于展示长列表数据的高性能滚动容器组件。以下是 List 的详细介绍和使用方法。 基本介绍 List 组件特点&#xff1a; 支持垂直/水平滚动高性能渲染&#xff08;仅渲染可视区域内…...

深度解析:从12306看混合云架构下的高并发系统设计

作为曾参与12306余票查询系统高并发升级的技术从业者&#xff0c;笔者注意到公众对于12306底层技术常存在认知盲区。为破解这一迷思&#xff0c;特此分享十年前的架构解密文献&#xff08;该技术之前名叫 gemfire 现已晋升为Apache顶级项目Geode&#xff0c;代码库详见&#xf…...

解决 EasyExcel 填充图片占满单元格问题

本篇主要记录解决使用EasyExcel 填充图片的两个问题&#xff1a; 1. 如何根据标识填充 2.如果完全占满要显示的单元格 import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.metadata.data.ImageData; import com.alibaba.e…...

汽车售后 D - PDU 和 J2543 详细介绍

D - PDU&#xff08;Diagnostic Protocol Data Unit&#xff09; 定义与标准1&#xff1a;D - PDU 是指诊断协议数据单元&#xff0c;ISO 22900 - 2 - 2017 D - PDU - API 是针对道路车辆的模块化车辆通信接口&#xff08;MVCI&#xff09;中诊断协议数据单元的编程接口标准。…...

【linux】Chrony服务器

简介 1.1 时间的重要性 由于 IT 系统中&#xff0c;准确的计时非常重要&#xff0c;有很多种原因需要准确计时&#xff1a; 在网络传输中&#xff0c;数据包括和日志需要准确的时间戳 各种应用程序中&#xff0c;如订单信息&#xff0c;交易信息等 都需要准确的时间戳 1.2 时区…...

深度剖析!GPT-image-1 API 开放对 AI 绘画技术生态的冲击!

4月24日凌晨&#xff0c;OpenAI正式发布了全新的图像生成模型“gpt-image-1”&#xff0c;并通过API向全球开发者开放使用&#xff0c;这意味着其GPT-4o的图像生成能力正式向开发者开放&#xff01; 在这之前&#xff0c;GPT-4o的图像生成功能于今年3月25日由 OpenAI 创始人兼 …...

天能资管(SkyAi):精准投资匹配,定制资产配置新体验

在资产配置领域,随着市场环境的日益复杂和投资者需求的日益多样化,个性化和精准化已成为投资者最为关注的核心诉求。天能资管(SkyAi)作为新加坡BEAVER TOKEN基金会旗下的科技先锋,凭借其强大的AI技术和丰富的市场经验,创新性地推出了精准投资匹配服务,为投资者带来了前所未有的…...

volatile缓存可见性实现原理

1.缓存一致性问题 在多核处理器架构中&#xff0c;每个核心都有自己的缓存&#xff08;Cache&#xff09;&#xff0c;而主内存是所有核心共享的。当一个线程在某个核心上修改了一个共享变量时&#xff0c;这个修改可能只会更新到该核心的缓存中&#xff0c;并不会立刻写回到主…...

【计算机视觉】CV实战- 深入解析基于HOG+SVM的行人检测系统:Pedestrian Detection

深入解析基于HOGSVM的行人检测系统&#xff1a;从理论到实践 技术核心&#xff1a;HOGSVM检测框架HOG特征原理SVM分类器 项目架构与数据准备INRIA Person数据集目录结构 实战指南&#xff1a;从零构建检测系统环境配置完整训练流程检测应用 关键技术问题与解决方案1. 难例挖掘不…...

HDRnet——双边滤波和仿射变换的摇身一变

主页&#xff1a;Deep Bilateral Learning paper&#xff1a;https://groups.csail.mit.edu/graphics/hdrnet/data/hdrnet.pdf coeffs 这部分的处理对象是低分辨率图&#xff0c;利用CNN进行特征提取&#xff08;局部和全局&#xff09;&#xff0c;最后fuse得到grid&#xff…...

Spring的xxxAware接口工作原理-笔记

1.Aware 接口的工作原理 Spring 提供了多个 XXXAware 接口&#xff08;如 ApplicationEventPublisherAware、ApplicationContextAware、BeanFactoryAware 等&#xff09;&#xff0c;这些接口的核心作用是让 Bean 在初始化过程中自动获取特定的依赖。 实现 Aware 接口的 Bean…...

flume整合Kafka和spark-streaming核心编程

flume整合Kafka 需求1&#xff1a;利用flume监控某目录中新生成的文件&#xff0c;将监控到的变更数据发送给kafka&#xff0c;kafka将收到的数据打印到控制台&#xff1a; 1.查看topic 2.编辑flume-Kafka.conf&#xff0c;并启动flume 3.启动Kafka消费者 4.新增测试数据 5.查…...

第十四届蓝桥杯刷题——day20

第十四届蓝桥杯刷题——day20 引言题目一&#xff1a;工作时长题目二&#xff1a;与或异或题目三&#xff1a;翻转题目四&#xff1a;阶乘的和题目五&#xff1a;公因数匹配附录&#xff1a;源码gitee仓库 引言 蓝桥杯C研究生组&#xff08;河北赛区&#xff09;快要开赛了&…...

Python MCP客户端SDK实现

以下是一个用于与大模型MCP协议交互的Python客户端SDK实现: ```python import json import requests import uuid from typing import Dict, List, Any, Optional, Union from enum import Enum from datetime import datetime class MCPTaskType(Enum): TEXT_GENERATION…...

使用el-table表格动态渲染表头数据之后,导致设置fixed的列渲染出现问题

问题如下&#xff1a; 解决方法&#xff1a; 使用$nextTick和v-if&#xff0c;让el-table在页面渲染完成之后再显示 <el-table v-if"visile"></el-table> 获取数据的方法 getdata(){ //这里处理数据 this.visilefalse //不显示table组件 this.$nex…...

Vue 3 父子组件通信案例详解:Props 与 Emits 实战

前言 在 Vue 3 开发中&#xff0c;组件通信是最基础也是最重要的技能之一。本文将用实际案例演示 Vue 3 中最常用的两种父子通信方式&#xff1a;Props&#xff08;父传子&#xff09;和 Emits&#xff08;子传父&#xff09;&#xff0c;帮助大家快速掌握 Composition API 下…...

kotlin与MVVM结合使用总结(三)

1. MVVM 架构详细介绍及源码层面理解 整体架构 MVVM&#xff08;Model - View - ViewModel&#xff09;架构是为了解决视图和数据模型之间的耦合问题而设计的。它通过引入 ViewModel 作为中间层&#xff0c;实现了视图和数据的分离&#xff0c;提高了代码的可维护性和可测试性…...

前端基础之《Vue(11)—自定义指令》

一、自定义指令 1、自己封装指令 什么是指令&#xff1f;指令本质上就是DOM功能的一种抽象封装。 如果有一些DOM功能经常用&#xff0c;但是Vue没有提供相关指令&#xff0c;建议自己封装。 2、自定义全局指令 使用Vue.directive(指令名, function() {})定义全局指令。 3、…...

第3.2节 Android应用调用链路分析

3.2.1 Android调用链路简介 在Android应用程序中&#xff0c;调用链路涉及应用程序中不同组件&#xff08;如Activity、Service、BroadcastReceiver、ContentProvider&#xff09;之间的调用关系&#xff0c;以及应用程序与系统服务之间的交互。了解和分析这些调用链路对于调试…...

Codeforces Round 1019 (Div. 2) ABC

A 模拟 思路 数组y是不同的&#xff0c;且所以xi * yi 相同&#xff0c;只有x数组全不同才可以满足要求 代码 LL n,m,k;void solve() {map<LL,LL> mp;cin >> n;for (int i 1;i < n;i ){LL x;cin >> x;mp[x] ;}cout << mp.size() << endl;…...

Babylon.js 材质统一转换指南:将 AssetContainer 中的所有材质转换为 PBRMetallicRoughnessMaterial

在现代 3D 开发中&#xff0c;基于物理的渲染(PBR)已成为行业标准。本文将详细介绍如何在 Babylon.js 中将 AssetContainer 加载的各种材质统一转换为 PBRMetallicRoughnessMaterial&#xff0c;实现项目材质的标准化。 为什么需要材质转换&#xff1f; PBRMetallicRoughness…...

Linux Platform驱动模型全解析:从入门到精通

Linux Platform驱动模型全解析&#xff1a;从入门到精通 1. Platform驱动模型概述 1.1 什么是Platform驱动模型 Platform驱动模型是Linux内核为处理非热插拔设备&#xff08;通常是SoC集成外设&#xff09;而设计的一套驱动框架。它通过虚拟的"platform总线"将硬件…...

7.Excel:单元格格式

一 案例 1.案例1 2.案例2 3.案例3 二 三种基本数据类型 补充&#xff1a;在没有任何格式的情况下是这样对齐的。 1.文本 默认左对齐&#xff0c;文本不可参与计算。 2.数值 默认右对齐&#xff0c;数值计算精度是15位。 若超出15位&#xff0c;超出部分显示为0。 3.逻辑值 …...

文件传输过滤器绕过:Exe2Hex

Exe2hex是****g0tmilk开发的一款工具,您可以**在这里找到它。该工具将 EXE 文件转录为一系列十六进制字符串**,DEBUG.exe或Powershell可以将其还原为原始 EXE 文件。之后,该脚本会在受害者机器上运行,重建并执行 EXE 文件。这在系统管理员阻止EXE 文件传输或上传的****高级…...

从多类缺陷到高良率跃升|公差分析技术重构动力电池装配精度体系

在新能源汽车产业升级关键期&#xff0c;动力电池装配精度和因装配引起的安全问题已成为制约产能提升的核心瓶颈。某头部电池企业通过 CETOL 6σ 公差分析技术&#xff0c;成功构建了复杂电池系统的精度控制体系。生产实践表明&#xff0c;微观尺度的公差偏差可能引发系统性质量…...

QT开发技术【QT实现桌面右下角消息】

一、效果 ![ 二、弹窗主体部分 noticewidget /* ** File name: NoticeWidget.h ** Author: ** Date: 2025-04-25 ** Brief: 通知栏控件 ** Copyright (C) 1392019713qq.com All rights reserved. */#include "../Include/NoticeWidget.h"…...