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

【Linux】动静态库链接原理

📝前言:

这篇文章我们来讲讲Linux——动静态库链接原理

🎬个人简介:努力学习ing
📋个人专栏:Linux
🎀CSDN主页 愚润求学
🌄其他专栏:C++学习笔记,C语言入门基础,python入门基础,C++刷题专栏


目录

  • 一,目标文件
  • 二,ELF文件
    • ELF文件格式的特点
    • 1. ELF形成可执行
    • 2. ELF可执行加载
      • 具体查看
        • Section查看
        • Segment查看
        • ELF Header查看
  • 三,理解链接与加载
    • 1. 静态链接与静态库加载
      • 查看编译后的符号表
        • 符号表
      • 查看反汇编目标文件的内容
    • 2. ELF加载与进程地址空间
      • 静态链接总结
    • 3. 动态链接与动态库加载
      • 动态链接器
      • 库间的依赖
      • PLT

一,目标文件

在这里插入图片描述
我们都知道,形成可执行需要经过 编译 + 链接两个步骤。当.c文件经过编译后形成的.o文件就叫做可重定位/可重定向目标文件。
当我们只有一个.c文件被修改时,我们只需要对修改的文件进行重新编译就行了,其他文件不需要。

二,ELF文件

.o文件,动静态库,可执行文件,内核转储(core dumps)都是ELF格式的二进制文件。

ELF文件格式的特点

ELF文件被划分成很多个
在这里插入图片描述

  • ELF Header:描述文件的全局属性,主要作用是定位⽂件的其他部分
  • Program Header Table 列举了所有有效的段(segments)和他们的属性。表里记着每个段的开始的位置和位移(offset)、长度。(链接阶段,有合并以后才会生成 Program Headers)【segments是什么后面讲】
  • 用来描述整个ELF文件
  • Section就是,不同的数据会被存储到不同的节中。如代码节存储了可执行代码,数据节存储了全局变量和静态数据等
  • Section Header Table用来描述每个节的信息

1. ELF形成可执行

  1. 将多份 C/C++ 源代码,翻译成为⽬标 .o⽂件
  2. 将多份 .o ⽂件section进行合并(合并是:链接的过程之一)

在这里插入图片描述
简单来说,就是把多个.o文件 中具有相同特性的Section合并成一个大的Segment

2. ELF可执行加载

  • 一个ELF文件在加载到内存的时候,也会把这个文件中具有相同特性(比如:把只读的代码段和只读数据合并)的Section合并,形成segment
  • 这个合并⼯作也已经在形成ELF的时候,合并⽅式已经确定了,具体合并原则被记录在了ELF的 程序头表(Program header table) 中

为什么要将Section合并?

  1. 为了减少页面碎片,提高内存使用效率。如果不进行合并,假设页面大小为 4096 字节(内存块基本大小,加载,管理的基本单位),如果.text部分为4097字节,.init部分为 512 字节,那么它们将占用 3 个页面(.text两个 + .init一个),而合并后,它们只需 2 个页面。
  2. 将具有相同属性的section合并成⼀个大的segment,可以实现不同的访问权限,从而优化内存管理和权限访问控制

具体查看

Section查看

查看可执行程序的Section(我的可执行名称叫test):

readelf -S test

在这里插入图片描述
我们可以看到Section header table对每个Section的描述

查看可执行程序的Segment

readelf -l test

在这里插入图片描述
在图片中,我们就可以看到有哪些Section被合并成了一个Segment

提几个重要的Section

  • text节 :保存了程序代码指令的代码节。
  • data节 :保存了初始化的全局变量和局部静态变量等数据。
  • .rodata节 :保存了只读的数据,如一行C语⾔代码中的字符串。
  • .bss节 :为未初始化的全局变量和局部静态变量预留位置(对于未初始化的全局变量,我们没必要真正开辟空间,只需要在.bss里面描述出有多少未初始化的就行)
  • .symtab节 : Symbol Table 符号表,就是源码里面那些函数名、变量名和代码的对应关系。
  • .got.plt节 (全局偏移表 - 过程链接表):.got节保存了全局偏移表。.got节和.plt节⼀起提供了对导⼊的共享库函数的访问⼊⼝,由动态链接器在运行时进行修改。
Segment查看

我们还可以看到其他信息:
在这里插入图片描述
我们可以看到Program Header table对每个段的描述

你会不会很好奇,为什么可执行程序既有Section又有Segment
其实这只是ELF 文件提供 2 个不同的视图/视角来让我们理解这两个部分:

  • Section 是链接视图(Linking View),面向开发者/工具链。用于编译和链接阶段,供编译器、链接器和调试工具使用
  • Segment 是执行视图(Execution View),面向操作系统。用于程序加载和运行时,指导操作系统如何将文件映射到内存
ELF Header查看

用命令:

readelf -h test

在这里插入图片描述

  • 我们可以看到ELF Header保存着一些大小 / 入口信息,用于定位⽂件的其他部分
  • 系统通过Magic来判断文件是不是ELF的格式。Entry point(标识可执行程序的入口地址【虚拟地址】)

三,理解链接与加载

1. 静态链接与静态库加载

因为静态库就是都是.o文件打包的,并且静态库在形成可执行的时候,会把库中的函数实现直接拷贝一份到可执行里面。所以研究静态链接,本质上是在研究.o文件是如何链接的。

test.c文件内容

  1 #include "mystring.h"                                                                                                                                                                                        2 3 int main()4 {5     char* msg = (char*)"hello world\n";6     print(msg); // 调用自定义的print7     return 0;8 }

查看编译后的符号表

符号表

符号表用于记录了目标文件中定义和引用的符号相关信息,如:函数名、变量名、全局常量名等。
会用一个长字符串表来存储,像这样:
在这里插入图片描述
然后通过\0来划分他们,通过\0我们可以记录每个符号在串中的起始结束下标,就可以很快得到这个符号的名称。

readelf -s test.o

在这里插入图片描述
可以发现printUND的,就是:没有定义

查看反汇编目标文件的内容

 objdump -d test.o

在这里插入图片描述

  • 这里,调用print函数,但是它的跳转地址被设置成了 0
  • 这是因为:在编译 test.c 的时候,编译器知道有print函数(因为有声明)但是不知道具体的实现(即:不知道print在内存的哪里)。因此,编译器只能将这两个函数的跳转地址先暂时设为0
  • 链接的时候!.o文件被合并,就会修改call中不确定的地址。(这就是静态链接,也是外部符号的地址重定位步骤)

在这里插入图片描述

2. ELF加载与进程地址空间

—个ELF程序,在没有被加载到内存的时候,有没有地址呢?
答案:有的,有虚拟地址

—个ELF程序,在没有被加载到内存的时候,采用"平坦模式"(就是地址下标从 0 开始连续编址),对自己的代码和数据进行统⼀编址
在这里插入图片描述
最左侧的就是ELF的虚拟地址!严格意义上应该叫做逻辑地址(起始地址 + 偏移量)

  • 进程的mm_structvm_area_struct在进程刚刚创建的时候,就是用ELF的统一编址的信息来初始化的。(每个segment有自己的起始地址和自己的长度,用来初始化内核结构中的[start, end]等范围数据)
  • 同时,记载到内存中的可执行文件也有对应的物理内存地址
  • 这样mm_struct的虚拟地址有了,程序的物理内存地址也有了,就可以填写页表了!!!
  • 所以:虚拟地址机制,不光OS要⽀持,编译器也要支持

静态链接总结

在这里插入图片描述
通过这张图梳理一遍静态链接:

  • 首先,ELF文件在没有加载到内存时,已经有了统一编址
  • 链接前,.o文件彼此不知道对方,所以没有办法call函数调用的具体地址
  • 在链接阶段,会把可执行程序中需要的静态库的库方法,拷贝一份给可执行程序。(这个时候,方法有了明确的地址,就可以进行地址重定位,把call的内容修改成具体的方法地址)
  • 当程序加载到内存中时,用统一编址初始化mm_struct,再结合实际物理内存地址,就可以构建好页表
  • 并将程序的入口Entry被传入到CPU的寄存器EIP中,就可以拿着EIP中的Entry进入程序并执行

也就是说:静态链接在链接阶段,已经完成了地址重定位操作,运行阶段已经不需要静态库了,所以是编译时(链接阶段)链接!

3. 动态链接与动态库加载

  • 对于动态链接,动态库并不会直接拷贝到可执行程序的代码中。
  • 所有程序是共用内存中的一份动态库代码的

那么,进程之间,又是如何共享库的呢?
在这里插入图片描述
先不挖细节,先说整体轮廓:

  • 动态库也是文件,需要独立加载到内存中,有自己的内存区域
  • 当动态库加载到内存中时,动态库的ELF格式会用来初始化进程mm_struct的共享区
  • 当在运行代码区的代码时,遇到了动态库的方法,就会从代码区跳转到共享区,得到对应方法的虚拟地址,然后就可以用虚拟地址通过页表映射找到内存中的代码了

看似没啥问题,但是,我们把目标放在从代码区跳转到共享区这一步:
如果要跳转,则代码区应该知道对应方法的内存地址。可是,如果动态库是独立的文件,只有程序加载的时候,动态库才能真真被加载ELF的虚拟内存地址里。才能有对应方法的地址。所以动态链接,也就被推迟到了加载时

所以:

  • 因为动态库也是独立的文件,也要加载到进程的mm_struct ,但是在加载之前,动态库还没有映射到mm_struct上(即:动态库的同一编址还没有用来初始化对应的mm_struct里面对应的区域)
  • 所以在编译链接时:可执行程序里面的代码段,就不知道对应动态库方法call。(无法像静态链接一样,直接填上方法具体的地址)
  • 只能等到程序加载到内存里以后,再填上。(这就是加载时链接
  • 但是,因为当可执行程序加载到内存中以后,代码区具有只读性,无法修改。所以我们需要借助一个中间层,来修改call的地址。
  • 这个中间层就是GOT(全局偏移量表),我们让GOT表位于.data区(可修改),每一个位置存放着:方法 + 对应方法的库名称【本质是:方法在库中的偏移量 + 库名称】
  • 而,原来的代码中call:GOT表的起始地址 + 要调用的方法在GOT表中的偏移量
  • 当我们加载程序时,动态库被加载到了mm_struct,就知道了动态库的虚拟起始地址。
  • GOT表就会被修改,里面每个位置存储的(通过:方法在库中的偏移量 + 库名称)就变成了对应方法的绝对虚拟地址【这样就相当于间接改了代码区的call】,此时页表也会被填写
  • 这就完成了重定位,完成了动态链接

和文件系统关联起来:
在这里插入图片描述
这种⽅式实现的动态链接就被叫做 PIC 地址⽆关代码 。换句话说,我们的动态库不需要做任何修改,被加载到任意内存地址都能够正常运⾏,并且能够被所有进程共享,这也是为什么之前我们给编译器指定-fPIC参数的原因,PIC=相对编址+GOT

下面在谈几个更细节的知识

动态链接器

【以下内容由AI生成】
在这里插入图片描述
/lib64/ld - linux - x86 - 64.so.2这就是动态连接器,加载动态库、符号解析与重定位、处理库依赖、初始化库函数…都是由它完成的。

在C/C++程序中,当程序开始执行时,并不会直接跳转到 main 函数。实际上,程序的入口是 _start ,这是⼀个由C运行时库(通常是glibc)或链接器(如ld)提供的特殊函数。在 _start 函数中,会执⾏⼀系列初始化操作,其中就包括动态链接:
_start 函数会调⽤动态链接器的代码来解析和加载程序所依赖的动态库(shared libraries)。动态链接器会处理所有的符号解析和重定位,确保程序中的函数调⽤和变量访问能够正确地映射到动态库中的实际地址。

库间的依赖

库也会调⽤其他库!!库之间是有依赖的,如何做到库和库之间互相调⽤也是与地址⽆关的呢?
答:库中也有.GOT,和可执行⼀样。
在这里插入图片描述

PLT

PLT:延迟绑定(Lazy Binding)
作用:

  • 避免在程序启动时解析所有动态库函数(如果库函数很多的话,就很浪费时间,因为有些库函数可能没被使用)
  • 而是在函数首次被调用时才进行地址解析

更具体的比较复杂,就不讲述了。


🌈我的分享也就到此结束啦🌈
要是我的分享也能对你的学习起到帮助,那简直是太酷啦!
若有不足,还请大家多多指正,我们一起学习交流!
📢公主,王子:点赞👍→收藏⭐→关注🔍
感谢大家的观看和支持!祝大家都能得偿所愿,天天开心!!!

相关文章:

【Linux】动静态库链接原理

📝前言: 这篇文章我们来讲讲Linux——动静态库链接原理 🎬个人简介:努力学习ing 📋个人专栏:Linux 🎀CSDN主页 愚润求学 🌄其他专栏:C学习笔记,C语言入门基础…...

Axure设计的“广东省网络信息化大数据平台”数据可视化大屏

在数据驱动决策的时代,数据可视化大屏成为了展示数据、洞察趋势的重要工具。今天,让我们一同深入了解由Axure设计的“广东省网络信息化大数据平台”数据可视化大屏,看看它如何通过精心的布局和丰富的图表类型,将复杂的数据以直观易…...

linux安装宝塔面板到数据盘

操作很简单,假如数据盘挂载在cipan1,在数据盘新建目录www,为了方便对应。 执行一下命令,创建软连接 ln -s /cipan1/www www 此时,根目录就出现了www文件夹 下面正常安装宝塔即可...

数学实验(Matlab编程基础)

一、函数文件 Matlab编程基础 Matlab作为一种广泛应用于科学计算的工具软件,不仅具有强大的数值计算、符号计算、矩阵运算能力和丰富的绘图功能,同时也具有和C、FORTRAN等高级语言一样进行程序设计 利用Matlab的程序控制功能,可以将有关Ma…...

不同坐标系下MATLAB绘制阵列的方向图

不同坐标系下MATLAB绘制阵列的方向图 球坐标系,极坐标系、直角坐标系 文章目录 前言一、极坐标系二、球坐标系三、直角坐标系总结 前言 \;\;\;\;\; 在阵列信号处理和天线设计中,方向图(Pattern)是描述波束形成性能的关键工具&…...

python可视化:北方省市人口流动与春运数据综合分析5

python可视化:北方省市人口流动与春运数据综合分析5 一、北方省市常住人口数据及变化趋势(2023-2024第一季度) 1. 主要城市常住人口数据(按城市等级分类) 城市类型2023Q1常住人口(万)2024Q1常住人口(万)变化量(万)变…...

Java并发编程-线程池(四)

文章目录 线程池实现原理WorkerWorker 核心设计总结 runWorker(Worker w)总结 线程池实现原理 上一篇我们看了 addWork 方法,那接下来就让我们详细看看内部类Worker。 Worker private final class Workerextends AbstractQueuedSynchronizerimplements Runnable …...

力扣热题——最长相邻不相等子序列 |

题目要求从字符串数组 words 中选出一个最长的子序列,使得该子序列中相邻字符串对应的 groups 数组中的值不同。通过贪心算法,可以高效地解决该问题。具体步骤为:初始化一个结果列表,遍历 words 数组,检查当前字符串的…...

筑牢信息安全防线:涉密计算机与互联网隔离的理论实践与风险防控

在数字化时代,信息安全已成为国家安全体系的重要组成部分。涉密计算机作为承载敏感信息的核心载体,其安全防护工作直接关系到国家利益与社会稳定。违规连接互联网这一行为,如同在严密的防护体系中打开一扇危险的"暗门",…...

sqli-labs靶场29-31关(http参数污染)

目录 前言 less29(单引号http参数污染) less30(双引号http参数污染) less31(双引号括号http参数污染) 前言 在JSP中,使用request.getParameter("id")获取请求参数时,如果存在多个同名参数&a…...

基于Linux环境实现Oracle goldengate远程抽取MySQL同步数据到MySQL

基于Linux环境实现Oracle goldengate远程抽取MySQL同步数据到MySQL 场景说明: 先有项目需要读取生产库数据,但是不能直接读取生产库数据,需要把生产数据同步到一个中间库,下游系统从中间库读取数据。 生产库mysql - OGG - 中间库…...

linux,我启动一个springboot项目, 用java -jar xxx.jar ,但是没多久这个java进程就会自动关掉

当使用 java -jar xxx.jar & 启动 Spring Boot 项目后进程自动关闭时,可能由多种原因导致。以下是常见排查步骤和解决方案: 一、查看日志定位原因 进程异常关闭通常会在控制台或日志中留下线索,建议先获取完整日志: 1. 查看…...

pytorch 14.3 Batch Normalization综合调参实践

文章目录 一、Batch Normalization与Batch_size综合调参二、复杂模型上的Batch_normalization表现1、BN对复杂模型(sigmoid)的影响2、模型复杂度对模型效果的影响3、BN对复杂模型(tanh)的影响 三、包含BN层的神经网络的学习率优化…...

供应链安全检测系列技术规范介绍之一|软件成分分析

软件成分分析的概念及意义 软件成分分析Software Compostition Analysis(SCA)是一种用于管理开源组件应用安全的方法。软件成分分析系统可以快速跟踪和分析应用软件的开源组件,发现相关组件、支持库以及它们之间直接和间接依赖关系&#xff0…...

pytorch 15.1 学习率调度基本概念与手动实现方法

文章目录 一、学习率对模型训练影响 二、学习率调度基本概念与手动实现方法1.模型调度基本概念2.手动实现学习率调度3.常用学习率调度思路 从本节开始,我们将介绍深度学习中学习率优化方法。学习率作为模型优化的重要超参数,在此前的学习中,我…...

c++ 类的语法4

测试析构函数、虚函数、纯虚函数&#xff1a; void testClass5() {class Parent {public:Parent(int x) { cout << "Parent构造: " << x << endl; }~Parent() {cout << "调用Parent析构函数" << endl;}virtual string toSt…...

品铂科技在UWB行业地位综述(2025年更新)

一、行业领先地位‌ ‌国内UWB领域头部企业‌ 在2025年中国UWB企业综合实力排行榜中位列第一&#xff0c;技术研发、市场份额及行业影响力均处于领先地位。连续多年获评中国物联网产业联盟“中国最有影响力物联网定位企业”。 2.‌全球技术竞争力‌ .2016年IPSN微软国际室内…...

muduo库EventLoop模块详解

muduo库EventLoop模块深度解析 EventLoop是muduo网络库实现Reactor模型的核心调度中枢&#xff0c;负责驱动整个事件循环机制&#xff0c;协调Poller、Channel、TimerQueue等组件的工作。其设计遵循"One Loop Per Thread"原则。 一、核心职责与设计思想 1. 核心职责…...

循环导入(Circular Import) 错误

ImportError: cannot import name event_type_data_tree from partially initialized module routers.ticket (most likely due to a circular import) (E:\ai12345\backend\app\routers\ticket.py) 这是什么错&#xff0c;中文回答 这个错误是 循环导入&#xff08;Circular …...

基于大数据的租房信息可视化系统的设计与实现【源码+文档+部署】

课题名称 基于大数据的租房信息可视化系统的设计与实现 学 院 专 业 计算机科学与技术 学生姓名 指导教师 一、课题来源及意义 租房市场一直是社会关注的热点问题。随着城市化进程的加速&#xff0c;大量人口涌入城市&#xff0c;导致租房需求激增。传统的租…...

奥运数据可视化:探索数据讲述奥运故事

在数据可视化的世界里&#xff0c;体育数据因其丰富的历史和文化意义&#xff0c;常常成为最有吸引力的主题之一。今天我要分享一个令人着迷的奥运数据可视化项目&#xff0c;它巧妙地利用交互式图表和动态动画&#xff0c;展现了自1896年至今奥运会的发展历程和各国奥运成就的…...

linux环境下 安装svn并且创建svn版本库详细教程

​一、安装SVN​ ​通过yum安装Subversion​ 在Linux系统中执行以下命令安装&#xff1a; yum install subversion -y 安装完成后&#xff0c;验证版本&#xff1a; svnserve --version ​二、创建版本库 ​选择存储路径并创建目录​ 通常将版本库放在/var/svn或/usr/local/…...

STM32控制电机

初始化时钟&#xff1a;在 STM32 的程序中&#xff0c;初始化系统时钟&#xff0c;一般会使用 RCC&#xff08;Reset and Clock Control&#xff09;相关函数来配置时钟。例如&#xff0c;对于 STM32F103 系列&#xff0c;可能会使用 RCC_APB2PeriphClockCmd 函数来使能 GPIO 和…...

Ubuntu 更改 Nginx 版本

将 1.25 降为 1.18 先卸载干净 # 1. 完全卸载当前Nginx sudo apt purge nginx nginx-common nginx-core# 2. 清理残留配置 sudo apt autoremove sudo rm -rf /etc/apt/sources.list.d/nginx*.list修改仓库地址 # 添加仓库&#xff08;通用稳定版仓库&#xff09; codename$(…...

微服务初步学习

系统架构演变过程 一、单体架构 前后端都在一个项目中&#xff0c;包括我们现在的前后端分离开发&#xff0c;都可以看作是一个单体项目。 二、集群架构 把一个服务部署多次&#xff0c;可以解决服务不够的问题&#xff0c;但是有些不必要的功能也跟着部署多次。 三、垂直架…...

旧 docker 版本通过 nvkind 搭建虚拟多节点 gpu 集群的坑

踩坑 参考nvkind教程安装到Setup这一步&#xff0c;由于docker版本较旧&#xff0c;–cdi.enabled 和 config 参数执行不了 手动修改 /etc/docker/daemon.json 配置文件 "features": {"cdi": true}手动修改 /etc/nvidia-container-runtime/config.toml 配…...

Fabric 服务端插件开发简述与聊天事件监听转发

原文链接&#xff1a;Fabric 服务端插件开发简述与聊天事件监听转发 < Ping通途说 0. 引言 以前写过Spigot的插件&#xff0c;非常简单&#xff0c;仅需调用官方封装好的Event类即可。但Fabric这边在开发时由于官方文档和现有互联网资料来看&#xff0c;可能会具有一定的误…...

Wise Disk Cleaner:免费系统清理工具,释放空间,提升性能

Wise Disk Cleaner是一款功能强大且完全免费的系统清理工具&#xff0c;专为帮助用户清理系统中的无用文件和垃圾文件而设计。它能够有效释放磁盘空间&#xff0c;提高系统运行速度&#xff0c;确保电脑始终保持最佳性能。无论是日常维护还是深度清理&#xff0c;Wise Disk Cle…...

排序算法之高效排序:快速排序,归并排序,堆排序详解

排序算法之高效排序&#xff1a;快速排序、归并排序、堆排序详解 前言一、快速排序&#xff08;Quick Sort&#xff09;1.1 算法原理1.2 代码实现&#xff08;Python&#xff09;1.3 性能分析 二、归并排序&#xff08;Merge Sort&#xff09;2.1 算法原理2.2 代码实现&#xf…...

主打「反激进」的一汽丰田,靠稳扎稳打的技术实现突围

文/王俣祺 导语&#xff1a;今年的上海车展&#xff0c;当新势力都在用“1000TOPS算力”“激光雷达矩阵”等参数堆砌着一个个技术神话的时候&#xff0c;一汽丰田却选择了一条不同的路——用“反激进”的技术哲学&#xff0c;在电动化和智能化的大风向中&#xff0c;构建独特的…...

变量赋值和数据类型

对象 Python是面相对象的编程语言&#xff0c;在Python一些都是对象&#xff0c;对象由标识、类型、值三部分组成&#xff0c;本质上来讲&#xff0c;系统分配一块内存&#xff0c;这块内存中存储了特定了的值&#xff0c;还支持特定类型的相关操作。 标识&#xff1a;即对象…...

【笔记】cri-docker.service和containerd

cri-docker.service 和 containerd 都是 Kubernetes 支持的容器运行时组件&#xff0c;但它们的架构、功能定位及与 Docker 的关系有显著差异。以下是它们的核心区别和关联&#xff1a; 1. 功能定位 组件核心角色是否直接支持 CRIcontainerd轻量级容器运行时&#xff0c;直接管…...

技术文章:解决汇川MD500系列变频器干扰问题——GRJ9000S EMC滤波器的应用

1. 引言 汇川MD500系列变频器&#xff08;Variable Frequency Drive, VFD&#xff09;以其高性能、宽功率范围&#xff08;0.4kW-500kW&#xff09;和灵活的控制方式&#xff0c;广泛应用于工业自动化领域&#xff0c;如风机、水泵、传送带和压缩机等。然而&#xff0c;MD500系…...

频域中的反射-信号完整性分析

频域中的反射: 频域与时域的桥梁是傅里叶变换,一个周期信号可以拆分为许多个正弦波。所谓从频域中看信号,看到的可以是很多个频域中的点,也可以是许多个正弦波。 所以在大家眼中看到的信号如图4-13所示。我们可以将该信号分解为图4-14所示信号。 让我们来思考下面这个问题:…...

window nvidia-smi命令 Failed to initialize NVML: Unknown Error

如果驱动目录下的可以执行&#xff0c;那可能版本原因 "C:\Program Files\NVIDIA Corporation\NVSMI\nvidia-smi"复制"C:\Program Files\NVIDIA Corporation\NVSMI\nvidia-smi.exe"替换 C:\Windows\System32\nvidia-smi.exe 或者 把C:\Windows\System3…...

ubuntu 20.04 更改国内镜像源-阿里源 确保可用

镜像源是跟linux版本一一对应的,查询自己系统的版本号&#xff1a; 命令&#xff1a;lsb_release -a macw:~$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 20.04.6 LTS Release: 20.04 Codename: focal macw:~$…...

Elasticsearch 学习(一)如何在Linux 系统中下载、安装

目录 一、Elasticsearch 下载二、使用 yum、dnf、zypper 命令下载安装三、使用 Docker 本地快速启动安装&#xff08;ESKibana&#xff09;【测试推荐】3.1 介绍3.2 下载、安装、启动3.3 访问3.4 修改配置&#xff0c;支持ip访问 官网地址&#xff1a; https://www.elastic.co/…...

PYTHON训练营DAY27

装饰器 编写一个装饰器 logger&#xff0c;在函数执行前后打印日志信息&#xff08;如函数名、参数、返回值&#xff09; logger def multiply(a, b):return a * bmultiply(2, 3) # 输出: # 开始执行函数 multiply&#xff0c;参数: (2, 3), {} # 函数 multiply 执行完毕&a…...

Shell脚本日志输出完整指南(AI)

一、基础日志输出方法 1. 标准输出与错误重定向 在Shell脚本中&#xff0c;可以使用重定向操作符将命令输出记录到日志文件&#xff1a; >&#xff1a;覆盖写入文件>>&#xff1a;追加写入文件2>&#xff1a;重定向错误输出&>&#xff1a;同时重定向标准…...

node.js文件系统(fs) - 创建文件、打开文件、写入数据、追加数据、读取数据、创建目录、删除目录

注意&#xff1a;以下所有示例均是异步语法&#xff01; 注意&#xff1a;以下所有示例均是异步语法&#xff01; 创建文件 node.js 允许我们在计算机本地创建文件&#xff0c;例如创建一个 word 文件&#xff1a; // 引入核心模块(fs) var fs require(fs)// API fs.writeF…...

关于如何本地启动xxl-job,并且整合SpringBoot

1. 本地安装xxl-job并启动 拉取xxl-job的代码 git clone gitgithub.com:xuxueli/xxl-job.git配置xxl-job数据库 拉取代码后&#xff0c;代码的doc/db目录下有官方配置好的sql脚本&#xff0c;执行里面的sql脚本至本地数据库 3. 修改xxl-job默认的数据库配置 spring.dataso…...

基于Unity的简单2D游戏开发

基于Unity的简单2D游戏开发 摘要 本文围绕基于Unity的简单2D游戏开发进行深入探讨,旨在分析其开发过程中的技术架构与实现策略。通过文献综述与市场分析,研究发现,近年来Unity引擎因其优秀的跨平台特性及可视化编程理念,成为2D游戏开发的主要工具。文章首先梳理了游戏开发的…...

在服务器上安装AlphaFold2遇到的问题(3)_cat: /usr/include/cudnn_version.h: 没有那个文件或目录

[rootlocalhost ~]# cat /usr/include/cudnn_version.h cat: /usr/include/cudnn_version.h: 没有那个文件或目录这个错误表明系统找不到 cudnn_version.h 头文件&#xff0c;说明 cuDNN 的开发文件&#xff08;头文件&#xff09;没有正确安装。以下是完整的解决方案&#xff…...

Java生产环境设限参数教学

哈哈&#xff0c;这个问题问得好&#xff01;咱们用开餐厅的比喻来理解生产环境的四大必须设限参数&#xff0c;保证你听完再也不会忘&#xff01;&#xff08;搓手手&#xff09; 1. 堆内存上限&#xff1a;-Xmx&#xff08;厨房的最大容量&#xff09; 问题&#xff1a;想象…...

武汉火影数字全息剧秀制作:科技与艺术的梦幻联动

全息剧秀是通过全息投影技术、多媒体互动技术、舞台表演艺术等元素深度融合的新型演出形式。 随着科技的不断进步&#xff0c;投影技术的更加成熟&#xff0c;全息剧秀作为演艺行业的创新力量&#xff0c;正以其独特的魅力和无限的潜力&#xff0c;为观众带来全新的视听盛宴。 …...

MySQL锁机制详解与加锁流程全解析

一、MySQL锁机制全景图 1.1 锁类型体系 #mermaid-svg-czUB6iJgmHuOPdN1 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-czUB6iJgmHuOPdN1 .error-icon{fill:#552222;}#mermaid-svg-czUB6iJgmHuOPdN1 .error-text{f…...

云轴科技ZStack官网上线Support AI,智能助手助力高效技术支持

5月16日&#xff0c;云轴科技ZStack在官网&#xff08;www.zstack.io&#xff09;正式上线ZStack Support AI智能助手。该系统是ZStack应用人工智能于技术支持服务领域的重要创新&#xff0c;基于自研ZStack AIOS平台智塔及LLMOPS技术打造。 ZStack Support AI定位为智能客服&…...

深度学习笔记23-LSTM实现火灾预测(Tensorflow)

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a; 一、前期准备 1.导入数据 import pandas as pd import numpy as npdf_1 pd.read_csv("D:\TensorFlow1\woodpine2.csv") df_1import matplotlib.pyplot as…...

单例模式(Singleton Pattern)详解

单例模式(Singleton Pattern)详解 1. 定义与核心目标 单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供全局访问点。核心目标: 控制实例数量:防止重复创建对象,节省资源。统一管理共享资源:如配置管理、数据库连接池、日志处理器等。2. 实现方式及对比 (…...

IntelliJ IDEA打开项目后,目录和文件都不显示,只显示pom.xml,怎样可以再显示出来?

检查.idea文件夹 如果项目目录中缺少.idea文件夹&#xff0c;可能导致项目结构无法正确加载。可以尝试删除项目根目录下的.idea文件夹&#xff0c;然后重新打开项目&#xff0c;IDEA会自动生成新的.idea文件夹和相关配置文件&#xff0c;从而恢复项目结构。 问题解决&#xff0…...