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

【Linux从入门到精通】动静态库的原理与制作详解

  

  本篇文章主要是围绕动静态库的原理与制作进行展开讲解的。其中涉及到了inode的概念引入和软硬连接的讲解。会结合实际操作对这些抽象的概念进行解释,希望会对你有所帮助。

文章目录

一、inode 概念

二、软硬链接

2、1 软连接

2、2 硬链接

三、动静态库概念

3、1 静态库制作

3、2 静态库的使用

3、2、1 加载到系统的文件中 

3、2、2 指定路径直接使用

3、3 动态库制作

3、4 动态库的使用

3、4、1 指定路径直接使用

3、4、2 环境变量:LD_LIBRARY_PATH 

3、4、3 系统文件:/etc/ld.so.conf.d/ 

 四、总结


🙋‍♂️ 作者:@Ggggggtm 🙋‍♂️

👀 专栏:Linux从入门到精通  👀

💥 标题:动静态库💥

 ❣️ 寄语:与其忙着诉苦,不如低头赶路,奋路前行,终将遇到一番好风景 ❣️ 

一、inode 概念

  一个文件里面没有任何内容,文件的大小就是0吗?实际上并不是。我们知道,文件不仅仅要保存其内容,属性也是必不可少的。属性保存在哪里呢?

  Inode(Index Node)是文件系统中的一个重要概念,用于存储和管理文件的元数据。在UNIX和类UNIX操作系统中,如Linux,每个文件都与一个唯一的inode相关联。

Inode 包含了以下文件的元数据信息:

  1. 文件类型:指示文件的类型,如常见的普通文件、目录、符号链接等。
  2. 文件权限:描述了对文件的访问权限,包括拥有者、所属组和其他用户的读、写、执行权限。
  3. 文件大小:表示文件占用的磁盘空间大小。
  4. 日期和时间戳:记录了文件的创建时间、最近修改时间和最近访问时间。
  5. 硬链接计数:记录有多少个硬链接指向该文件。硬链接是指多个文件名指向同一个inode的情况。
  6. 文件数据块的物理地址:指示文件数据在磁盘上的存储位置。

  通过使用inode,操作系统可以有效地管理文件系统中的文件。例如,当需要读取或写入文件时,操作系统可以根据文件的inode查找文件的数据块的物理位置,以快速定位并访问文件内容。

  需要注意的是,inode与文件名是独立的。文件名与inode之间的对应关系由文件系统的目录结构来维护。当文件被打开或者通过文件名访问时,操作系统会根据文件系统的目录结构使用inode来定位文件。

二、软硬链接

2、1 软连接

  软连接(Symbolic Link)是一个指向另一个文件或目录的链接。它是一个特殊类型的文件,其中包含了所指向文件或目录的路径信息。软连接可以跨越不同的文件系统,甚至可以指向不存在的文件或目录。删除软连接不会影响被链接的文件或目录本身,而只会删除软连接本身。下面我们看一个实际的例子。

  如上图,我们在上图的路径中有一个可执行程序 mytest。假设我们想在其他路径下执行该程序,一种办法就是使用 相对路径/绝对路径 找到该可执行程序。具体如下图:

  但是每次都需要加上路径去执行该程序是不是优点太过繁杂。那有没有其他的便捷的方法呢?这里就可使用到软连接:ln -s ./test_8_19/bin/mytest mytest。具体如下图:

  对这种方法有一种莫名熟悉的感觉。在windows下,不就是在桌面创建快捷方式嘛!!!

软连接的主要特点和用途包括:

  • 文件间的共享:通过创建软连接,多个文件可以引用同一个文件,减少存储空间的占用。
  • 简化路径:软连接可以提供简洁的路径名,使得访问文件更加方便。
  • 跨文件系统的链接:软连接可以跨越不同的文件系统进行链接,增强了灵活性。
  • 动态更新:当原始文件或目录发生改变时,软连接也会实时更新,保持链接的有效性。

2、2 硬链接

  硬连接(Hard Link)是一个直接指向目标文件或目录的链接。硬连接与原始文件或目录没有区别,它们共享同一个索引节点,指向同一个磁盘区域,从而形成了相同的文件内容和属性。删除硬链接不会影响原始文件或目录,因为硬链接实际上是原始文件或目录的另一个名称。

  如上图,我们使用link指令创建了一个硬链接。我们发现他们的inode竟然相同。那么创建硬链接,并不是真正的创建文件。而是在目录下,建立了文件名与指定inode的映射关系而已!通俗理解,就是给指定文件起别名

  硬链接的主要特点和用途包括:

  • 文件备份:通过创建硬链接,可以在不占用额外存储空间的情况下,生成与原始文件内容完全相同的备份文件。
  • 文件共享:多个硬链接可以引用同一个文件,可以在不同位置使用相同的文件。
  • 快速访问:由于硬链接实际上是同一个文件,所以可以通过多个链接快速访问文件,提高效率。(隐藏文件 . ..)

  需要注意的是:

  • 软连接可以跨越不同的文件系统进行链接,而硬连接只能在同一文件系统中创建链接。
  • 删除原始文件并不会立即影响已经创建的硬链接,因为硬链接与原始文件共享相同的磁盘空间,只有当所有链接都被删除后,才会真正释放磁盘空间。
  • 软连接可以指向不存在的文件或目录,而硬连接必须指向已存在的文件或目录。

三、动静态库概念

3、1 静态库制作

  静态库是一种将一组预编译的目标文件(.o)打包成一个单独的文件的技术。它的主要作用是将代码模块化并提供给其他开发者使用,以便在编译阶段将这些模块链接到他们的程序中。

  静态库的形成: 静态库是由多个编译好的目标文件组成的,这些目标文件包含了被编译源代码的函数和数据。当我们将这些目标文件打包成一个单独的库文件时,就形成了静态库。通常,静态库的文件扩展名是.a(在Windows上也可以是.lib

形成静态库的过程包括:

  • 预处理:处理源代码中的宏定义、条件编译等预处理指令。
  • 编译:将预处理后的源代码编译成汇编代码。
  • 汇编:将汇编代码转换成机器码,并生成目标文件(通常是.o文件)。
  • 链接:将多个目标文件链接在一起形成静态库文件。

  如下图,我们经过编译生成了目标文件(.o)。

  我们再对 .o 文件打包生成静态库:ar -rc libhello.a mymath.o myprint.o。

  上述打包的过程就是生成静态库的过程。通俗来讲,静态库就是对.o 文件进行打包形成的

  我们所生成静态库的名字前缀必须是lib,后缀必须是.a 。这个就是规定。

  为了方便使用,我们将静态库和头文件统一放到一个目录下。具体操作如下:

libhello.a:mymath.o myprint.oar -rc libhello.a mymath.o myprint.omymath.o:mymath.cgcc -c mymath.c -o mymath.omyprint.o:myprint.cgcc -c myprint.c -o myprint.o.PHONY:hello
hello:mkdir -p hello/libmkdir -p hello/includecp -rf *.h hello/includecp -rf *.a hello/lib.PHONY:clean
clean:rm -rf *.a *.o hello

3、2 静态库的使用

  我们再把打包静态库和头文件目录(hello)拷贝到上级目录下一个文件中进行调用使用。

  我们直接编译main.c 文件,可以吗?看下图:

  是不可以的。编译时会自动在本目录下查找头文件。如果找不到,就回去系统的文件中查找。该目录下确实是没有,所以试过报错的。那怎么才能使用呢?

3、2、1 加载到系统的文件中 

  gcc 编译时,头文件的默认搜索路径是:/usr/include。库文件的默认搜索路径是:/lib64。当我们把自己所写的头文件和静态库加载到系统默认的搜索路径后,就会自动找到我们所引入的头文件和库函数。具体操作如下:

  但是此时我们进行编译,还是会进行报错。如下图:

  这是为什么呢?我们自己写的库属于第三方库,在编译时必须需要指定库的名字。具体如下:

  虽然这样可以使用静态库,但是不支持这种做法。这样就有可能会污染系统的文件。

3、2、2 指定路径直接使用

  加载到系统的文件中不是一种很优的方法。哪还有其他方法吗?答案有的。我们在编译时直接告诉编译器路径:gcc main.c -I ./hello/include/ -L ./hello/lib/ -lhello。具体如下图:

3、3 动态库制作

   我们知道,静态库在编译过程中,目标文件被编译链接生成的可执行程序中包含所有函数和数据。可执行程序所占用内存比较大。当程序运行时,所有的代码和数据都被加载到内存中,并占用固定的内存地址。这种方式是静态链接,使得可执行文件的体积较大,且不具备代码共享的特性。而动态库并不是这样的,且动态库的生成与静态库也有所区别。我们接着往下看。

  动态库(Dynamic Link Library,简称DLL)是一种可执行文件,包含可以被多个程序同时调用的函数和数据。与静态库相比,动态库提供了更为灵活和高效的代码共享方式。

形成动态库的过程主要包括以下几个步骤:

  1. 编写动态库代码:根据需求编写所需的函数和数据,并将其封装在一个动态链接库项目中。

  2. 编译动态库代码:使用合适的编译器将动态库代码编译成二进制形式,生成具有扩展名为.dll(在Windows系统中)或.so(在Linux系统中)的文件。

  3. 链接动态库:将动态库文件与主程序进行链接,使主程序能够使用库中的函数和数据。在这个过程中,主程序并不会把动态库的内容复制到自己的代码中,而是在运行时通过动态链接来加载和使用库中的函数和数据。

  通过上图我们发现,在生成.o文件时多出了-fPIC选项。-fPIC选项是什么意思呢?

  gcc的-fPIC选项是用于生成可重定位目标文件(Position Independent Code,PIC)的编译选项。通过使用该选项,生成的目标文件可以在内存中的任何位置加载和执行,而不需要进行修改或重新链接

  在编译过程中,目标文件只包含程序所需的函数和数据的引用信息,真正的函数和数据则通过动态链接库(Dynamic Linking Library,DLL)提供。在程序运行时,操作系统会将需要的函数和数据从动态链接库中加载到内存,并进行地址重定向。这种方式使得可执行文件的体积较小,且不同程序之间可以共享同一个动态链接库。

  而-fPIC选项则是在编译过程中产生与位置无关的代码,主要用于动态链接库的创建。使用该选项可以确保生成的目标文件能够适应不同的内存布局和地址空间。具体来说,-fPIC选项会通过使用相对寻址(relative addressing)的方式替代绝对寻址(absolute addressing),使得目标文件中的函数和数据可以在不同的内存地址加载和执行。

  当我们有了目标文件(.o)后,再看如下图生成动态库:

3、4 动态库的使用

  为了同时生成静态库和动态库,我们再次进行对makefile文件进行改写,代码如下:

.PHONY:all
all:libhello.so libhello.alibhello.so:mymath_d.o myprint_d.ogcc -shared mymath_d.o myprint_d.o -o libhello.so
mymath_d.o:mymath.cgcc -c -fPIC mymath.c -o mymath_d.o
myprint_d.o:myprint.cgcc -c -fPIC myprint.c -o myprint_d.olibhello.a: mymath.o myprint.oar -rc libhello.a mymath.o myprint.o
mymath.o:mymath.cgcc -c mymath.c -o mymath.o
myprint.o:myprint.cgcc -c myprint.c -o myprint.o.PHONY:output
output:mkdir -p output/libmkdir -p output/includecp -rf *.h output/includecp -rf *.a output/libcp -rf *.so output/lib.PHONY:clean
clean:rm -rf *.o *.a *.so output

3、4、1 指定路径直接使用

   我们同样是先把打包动静态库和头文件目录(hello)拷贝到上级目录下一个文件中进行调用使用。动态库的直接指定路径使用与静态库相似。我们看如下实例:

  我们知道,动态库和静态库真是的名字去掉前后缀后都是hello。那我们直接使用-lhello,指定的是动态库还是静态库呢?也就是默认情况下是动态链接呢?还是静态链接呢?我们看选图:

  我们发现,默认情况下是动态链接。但是并没有找到动态库!且生成的可执行程序也不能执行。这又是为什么呢?原因是我们需要把动态库加载到内存中后,可被多个进程使用(因此也被称为共享库)。但是我们只是告诉gcc动态库所在的路径了,并没有告诉操作系统动态库在哪里!

3、4、2 环境变量:LD_LIBRARY_PATH 

  在Linux下,默认查找共享库的环境变量是LD_LIBRARY_PATHLD_LIBRARY_PATH是一个包含目录路径的环境变量,用于告诉动态链接器(ld.so)在哪些目录中搜索共享库文件

当程序需要加载共享库时,动态链接器会按照以下顺序进行搜索:

  1. 优先搜索程序内部指定的路径。
  2. 如果没有找到,接下来会搜索LD_LIBRARY_PATH中指定的路径。
  3. 如果还是没有找到,最后动态链接器会按照一定的默认规则搜索系统预定义的路径,如/usr/lib/lib等。

  通过设置LD_LIBRARY_PATH环境变量,可以临时修改共享库的搜索路径。例如,可以使用以下命令来设置LD_LIBRARY_PATH环境变量:

export LD_LIBRARY_PATH=/path/to/shared/libs

  该命令将/shared/libs目录添加到共享库搜索路径中。在当前的终端会话中,程序运行时将会优先搜索该路径下的共享库。

  但是LD_LIBRARY_PATH是一个临时的环境变量设置,只对当前终端会话有效。如果希望永久修改共享库的搜索路径,可以考虑修改系统范围内的配置文件,如/etc/ld.so.conf.d/目录下的配置文件,并执行相应的更新操作,例如使用ldconfig命令。稍后我们也会详细介绍。

  现在以我自己为例子来添加动态库到共享库的环境变量中。具体如下图:

  其实我们也不难发现,每个路径都是用 :来进行分割的。我们添加成功后,我们再次执行a.out 时,系统就回根据环境变量自动找到改动挑库所在的位置。运行如下图:

3、4、3 系统文件:/etc/ld.so.conf.d/ 

  在Linux系统中,/etc/ld.so.conf.d/目录是用来配置共享库搜索路径的。共享库在运行时被程序动态链接使用,这些库存储在特定的路径下。ld.so是动态链接器(loader)的一部分,它负责在运行程序时定位和加载所需的共享库。

  在/etc/ld.so.conf.d/目录中,可以创建不同的配置文件,每个文件对应一个共享库搜索路径。这些配置文件通常以.conf为后缀名。通过在这些配置文件中添加共享库的路径,可以告诉动态链接器在特定的目录中搜索共享库

  当系统启动或需要加载共享库时,动态链接器会读取这些配置文件,并根据其中的路径进行查找。如果某个共享库存在于指定的路径中,那么它将被加载到内存中供程序使用。使用/etc/ld.so.conf.d/目录可以方便地管理共享库路径的配置。可以在不同的配置文件中分别设置不同的共享库路径,这样可以根据需要独立地管理和更新路径的配置,而不会影响到其他配置文件。

  我们再来看一下具体的操作实例。我们在 /etc/ld.so.conf.d/ 下创建一个test.conf 文件。然后把我们动态库所在的路径编辑加入test.conf 文件中。

  我们再看就可以找到动态库了。

 四、总结

  动态库和静态库是两种代码库的形式,它们主要用于程序的模块化开发和代码共享。它们具有以下不同之处:

  1. 静态库(Static Library): 静态库在编译时会被完全链接到可执行文件中,使得可执行文件包含了所有需要的库函数和数据。使用静态库的主要优点是程序的独立性,无需依赖外部库文件即可运行。静态库适用于一些较小的应用,或者需要独立部署的情况。

  2. 动态库(Dynamic Library): 动态库在程序运行时由操作系统进行加载和链接,而不是在编译时完全链接到可执行文件。程序在运行时只需要动态库的引用并调用相应函数即可。使用动态库的主要优点是节约系统资源和提高可维护性。多个程序可以共享同一个动态库,减少了内存占用和可执行文件的大小。

为什么要有动态库和静态库呢?主要原因包括:

  1. 代码共享:将常用的功能进行封装成库,可以被多个应用程序共享使用,避免重复编写相同的代码,提高了代码的复用性和开发效率。

  2. 系统资源的优化:动态库的方式可以在程序运行时动态加载和链接,节省了内存的占用空间,提高了系统资源的利用效率。

  3. 可维护性:使用库的方式可以使得程序模块化,便于维护和更新。当库需要升级或修复BUG时,只需替换库文件而无需修改引用该库的程序。

相关文章:

【Linux从入门到精通】动静态库的原理与制作详解

本篇文章主要是围绕动静态库的原理与制作进行展开讲解的。其中涉及到了inode的概念引入和软硬连接的讲解。会结合实际操作对这些抽象的概念进行解释,希望会对你有所帮助。 文章目录 一、inode 概念 二、软硬链接 2、1 软连接 2、2 硬链接 三、动静态库概念 3、1 静态…...

【mybatis】mapper.xml中foreach的用法,含批量查询、插入、修改、删除方法的使用

一、xml文件中foreach的主要属性 foreach元素的属性主要有 collection,item,index,separator,open,close。 collection: 表示集合,数据源 item :表示集合中的每一个元素 index :用于…...

c#扩展方法的使用

扩展方法可以向现有类型“添加”方法,无需创建新的派生类型、重新编译或以其他方式修改原始类型,用起来很方便,下面是我写的例子,为string这个常用的类型添加一个showmes方法,以下是扩展方法的代码: public…...

rhel 8.7 部署 keepalived+haproxy 实现 mysql 双主高可用场景

文章目录 [toc]部署 mysql关闭防火墙关闭 selinux创建相关目录创建 mysql 用户配置 PATH 变量验证 mysql 命令切换到 mysql 用户在 172.72.0.116 生成配置文件在 172.72.0.137 生成配置文件mysql 初始化启动 mysql 服务修改 mysql 的 root 用户密码配置主从关系172.72.0.137 配…...

常见指令以及权限理解

常见指令以及权限理解 命令格式: command [-options] parameter1 parameter1 命令 选项 参数1 参数2 1.command为命令名称,例如变化目录的cd等 2.中括号[ ]实际在命令中是不存在的,这个中括号代表可选,通常选项前面会添加一个符号…...

OpenCV基础知识(6)— 滤波器

前言:Hello大家好,我是小哥谈。在尽量保留原图像信息的情况下,去除图像内噪声、降低细节层次信息等一系列过程,被叫做图像的平滑处理(或者叫图像的模糊处理)。实现平滑处理最常用的工具就是滤波器。通过调节…...

IOC容器的基础功能设计模式

构造模式 构造器的目的和构造函数一样,但是构造器可以提供丰富的api来简化对象的构造 构造模式用于简化被构造对象的创建,通过提供一大堆的api来丰富简化构造过程,增加调用者的体验。 构造者需要提供一个Build方法用于构建和返回将要构造的…...

FFmpeg参数说明FFmpegAndroid饺子视频播放器

FFmpegAndroid https://github.com/xufuji456/FFmpegAndroid https://github.com/lipangit/JiaoZiVideoPlayer/tree/develop 饺子视频播放器 ffmpeg 不是内部或外部命令,也不是可运行的程序 或批处理文件 http://www.360doc.com/content/21/0204/15/54508727_9606…...

DNS入门学习:DNS解析生效问题(中科三方)

在修改域名解析记录或DNS服务器之后,DNS解析并不会立即生效,这给很多网站管理者带来了很多困扰,了解DNS解析生效原理以及不同情况下DNS解析生效时间,对于网站管理工作有很大帮助。本文中科三方针对不同情况下DNS解析生效时间做下简…...

Ubuntu22.04编译安装Mysql5.7.35

新升级的ubuntu22.04版本,该版本默认openssl已经升级到3.0,所以编译过程遇到一些问题记录一下。 编译步骤: 安装依赖 gcc g已经安装过就不需要再安装了。 apt-get install cmake apt-get install libaio-dev apt-get install libncurses5…...

C++音乐播放系统

C音乐播放系统 音乐的好处c发出声音乐谱与赫兹对照把歌打到c上 学习c的同学们都知道,c是一个一本正经的编程语言,因该没有人用它来做游戏、做病毒、做…做…做音乐播放系统吧!! 音乐的好处 提升情绪:音乐能够影响我们…...

Django笔记之log日志记录详解

以下是一个简单的 logging 模块示例,可以先预览一下,接下来会详细介绍各个模块的具体功能: LOGGING {version: 1,disable_existing_loggers: False,formatters: {verbose: {format: %(levelname)s %(message)s,}},handlers: {file_1: {leve…...

vue局部打印多页面pdf

技术背景 html打印程pdf,使用的官方提供的window.print()打印的样式 media print {} 方法一 const printContent this.$refs.bodyright;var textInput printContent.getElementsByTagName("input");for (var i 0; i < textInput.length; i) {textInput[i].se…...

指定或降低Rust 工具链的版本

要更改 Rust 工具链的版本&#xff0c;您可以使用以下命令之一&#xff1a; rustup default stable&#xff1a;使用 stable 版本的 Rust 工具链作为默认版本。rustup default beta&#xff1a;使用 beta 版本的 Rust 工具链作为默认版本。rustup default nightly&#xff1a;使…...

数据驱动成功:商城小程序分析与改进

在当今数字化时代&#xff0c;商城小程序成为了企业与消费者之间互动的重要途径。然而&#xff0c;一个成功的商城小程序不仅仅是一个购物平台&#xff0c;更需要通过数据分析不断进行改进和优化&#xff0c;以提升用户体验和营销效果。本文将深入探讨如何利用数据驱动的方式进…...

基于GUI的卷积神经网络和长短期神经网络的语音识别系统,卷积神经网的原理,长短期神经网络的原理

目录 背影 卷积神经网络CNN的原理 卷积神经网络CNN的定义 卷积神经网络CNN的神经元 卷积神经网络CNN的激活函数 卷积神经网络CNN的传递函数 长短期神经网络的原理 基于GUI的卷积神经网络和长短期神经网络的语音识别系统 代码下载链接:基于MATLABGUI编程的卷积神经网络和长短期…...

Docker环境安装elasticsearch和kibana

一、安装elasticsearch 创建es-network&#xff0c;让es、kibana在同一个网段&#xff1a; docker network create --driverbridge --subnet192.168.1.10/24 es-network运行elasticsearch docker run -d \ --name elasticsearch \ # 容器名 --hostname elasticsearch # 主机…...

【剖析STL】vector

vector的介绍及使用 1.1 vector的介绍 cplusplus.com/reference/vector/vector/ vector是表示可变大小数组的序列容器。就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素 进行访问&#xff0c;和数组一样高效。但是…...

Redis、Memcache和MongoDB的区别

>>Memcached Memcached的优点&#xff1a; Memcached可以利用多核优势&#xff0c;单实例吞吐量极高&#xff0c;可以达到几十万QPS&#xff08;取决于key、value的字节大小以及服务器硬件性能&#xff0c;日常环境中QPS高峰大约在4-6w左右&#xff09;。适用于最大程度…...

2023中大ACM游记

游记 中午快十二点时才到了广州六中&#xff0c;在附近吃了塔斯汀汉堡&#xff0c;味道还不错。 十二点半才卡点到了考场&#xff0c;本以为来晚了&#xff0c;但老师说比赛时间延迟&#xff0c;十二点五十才开场。 三个人用一台电脑&#xff0c;这种比赛方式还是第一次遇到…...

记一次线上OOM事故

OOM 问题 linux内核有个机制叫OOM killer(Out-Of-Memory killer)&#xff0c;当系统需要申请内存却申请不到时&#xff0c;OOM killer会检查当前进程中占用内存最大者&#xff0c;将其杀掉&#xff0c;腾出内存保障系统正常运行。 一般而言&#xff0c;一个应用的内存逐渐增加&…...

Learning to Super-resolve Dynamic Scenes for Neuromorphic Spike Camera论文笔记

摘要 脉冲相机使用了“integrate and fire”机制来生成连续的脉冲流&#xff0c;以极高的时间分辨率来记录动态光照强度。但是极高的时间分辨率导致了受限的空间分辨率&#xff0c;致使重建出的图像无法很好保留原始场景的细节。为了解决这个问题&#xff0c;这篇文章提出了Sp…...

怎么使用手机远程控制Win10电脑?

可以使用手机远程控制电脑吗&#xff1f; “近期&#xff0c;我将出差一段时间。问题是&#xff0c;我希望能够从很远的地方浏览家里电脑上的一些东西&#xff0c;但我不会一直随身携带笨重的笔记本电脑。我可以手机远程访问Windows电脑吗&#xff1f; ” 当然&am…...

W6100-EVB-PICO 做UDP Client 进行数据回环测试(八)

前言 上一章我们用开发板作为UDP Server进行数据回环测试&#xff0c;本章我们让我们的开发板作为UDP Client进行数据回环测试。 连接方式 使开发板和我们的电脑处于同一网段&#xff1a; 开发板通过交叉线直连主机开发板和主机都接在路由器LAN口 测试工具 网路调试工具&a…...

Typora 相对路径保存图片以及 Gitee 无法显示图片

目录 Typora 相对路径保存图片 Gitee 无法显示图片 Typora 相对路径保存图片 Step1&#xff1a;修改 Typora 的偏好设置 自动在当前目录创建名为 "./${filename}.assets" 的文件夹粘贴图片到 md 中时&#xff0c;图片会自动另存到 "./${filename}.assets&qu…...

深入探索:Kali Linux 网络安全之旅

目录 前言 访问官方网站 导航到下载页面 启动后界面操作 前言 "Kali" 可能指的是 Kali Linux&#xff0c;它是一种基于 Debian 的 Linux 发行版&#xff0c;专门用于渗透测试、网络安全评估、数字取证和相关的安全任务。Kali Linux 旨在提供一系列用于测试网络和…...

Python 实现语音转文本

Python 实现语音转文本 Python可以使用多种方式来实现语音转文本&#xff0c;下面介绍其中两种。 方法一&#xff1a;使用Google Speech API Google Speech API 是 Google 在 2012 年推出的一个 API&#xff0c;可以用于实现语音转文本。使用 Google Speech API 需要安装 Sp…...

使用DSA、ECDSA、Ed25519 和 rfc6979_rust实现高安全性的数字签名

第一部分&#xff1a;背景和DSA简介 在数字世界中&#xff0c;确保数据的真实性和完整性是至关重要的。一个有效的方法是使用数字签名。在这篇文章中&#xff0c;我们将探讨四种流行的加密签名算法&#xff1a;DSA、ECDSA、Ed25519 和 rfc6979_rust。我们将重点讲解它们的基础…...

“深入探索JVM内部机制:解密Java虚拟机的奥秘“

标题&#xff1a;深入探索JVM内部机制&#xff1a;解密Java虚拟机的奥秘 摘要&#xff1a;本文将深入探索Java虚拟机&#xff08;JVM&#xff09;的内部机制&#xff0c;介绍JVM的基本原理、运行时数据区域以及垃圾回收机制&#xff0c;并通过示例代码解释这些概念。 正文&am…...

css3新增属性

文章目录 css3新增属性box-shadowborder-radius设置椭圆 position: sticky;渐变背景线性渐变可重复的渐变背景 径向渐变可重复的渐变背景 过渡分属性 动画关键帧与transition的关系demo 变形平移使用 旋转使用 其他使用立体效果perspective元素位于3D空间还是平面中 缩放变形的…...

自动驾驶港口车辆故障及事故处理机制

1、传感器故障&#xff1a; &#xff08;1&#xff09;单一传感器数据异常处理。自动驾驶电动平板传感方案为冗余设置&#xff0c;有其他传感器能够覆盖故障传感器观测区域&#xff0c;感知/定位模块将数据异常情况发给到规划决策模块&#xff0c;由“大脑”向中控平台上报故障…...

【leetcode 力扣刷题】快乐数/可被k整除的最小整数(可能存在无限循环的技巧题)

可能存在无限循环的技巧题 202. 快乐数数学分析 1015. 可被k整除的最小整数数学分析 202. 快乐数 题目链接&#xff1a;202. 快乐数 题目内容&#xff1a; 理解题意&#xff0c;快乐数就是重复每位数的平方之和得到的新数的过程&#xff0c;最终这个数能变成1。变成1以后&…...

Python 的下一代 HTTP 客户端

迷途小书童 读完需要 9分钟 速读仅需 3 分钟 1 环境 windows 10 64bitpython 3.8httpx 0.23.0 2 简介 之前我们介绍过使用 requests ( https://xugaoxiang.com/2020/11/28/python-module-requests/ ) 来进行 http 操作&#xff0c;本篇介绍另一个功能非常类似的第三方库 httpx&…...

网络安全---webshell实践

一、首先环境配置 1.上传文件并解压 2.进入目录下 为了方便解释&#xff0c;我们只用两个节点&#xff0c;启动之后&#xff0c;大家可以看到有 3 个容器&#xff08;可想像成有 3 台服务器就成&#xff09;。 二、使用蚁剑去连接 因为两台节点都在相同的位置存在 ant.jsp&…...

论AI GPT跨境贸易架构及其应用

摘要 2023年初,我司启动了智慧化跨境贸易供应链一体化平台的建设工作。我在该项目中担任系统架构设计师的职务,主要负责设计平台系统架构和安全体系架构。该平台以移动信息化发展为契机,采用”平台+AI”的模式解决现有应用的集中移动化需求。平台整体的逻辑复杂,对系统的高…...

github的CodeSpace如何对外提供TCP 端口服务?

github提供了codespace&#xff0c;一个IDE环境&#xff0c;可以远程以WEB的形式&#xff0c;运行VS code进行开发。 他会给你提供一个虚拟机&#xff0c;4核16G内存&#xff0c;还是很香的&#xff0c;比普通的VPS性能好多了。 缺点是没有独立的IP地址&#xff0c;无法对外进…...

借助Midjourney创作龙九子图

&#xff08;本文阅读时间&#xff1a;5 分钟&#xff09; 《西游记》中有这么一段描写&#xff1a; 龙王道&#xff1a;“舍妹有九个儿子。那八个都是好的。第一个小黄龙&#xff0c;见居淮渎&#xff1b;第二个小骊龙&#xff0c;见住济渎&#xff1b;第三个青背龙&#xff0…...

Azure存储访问层

blob数据的热访问层&#xff0c;冷访问层和存档访问层 Azure Blob 存储是一种托管对象存储服务&#xff0c;可用于存储和访问大量非结构化数据&#xff0c;如文本和二进制数据。Azure Blob 存储提供了三个不同层级的访问方式&#xff0c;以适应不同数据的使用模式和成本效益需…...

Unity进阶–通过PhotonServer实现人物移动和攻击–PhotonServer(五)

文章目录 Unity进阶–通过PhotonServer实现人物移动和攻击–PhotonServer(五)DLc&#xff1a; 消息类和通信类服务器客户端 Unity进阶–通过PhotonServer实现人物移动和攻击–PhotonServer(五) DLc&#xff1a; 消息类和通信类 Message namespace Net {public class Message{p…...

中间件: Redis安装与部署

单机部署 yum install -y epel-release yum install -y redissed -i "s/bind 127.0.0.1/bind 0.0.0.0/g" /etc/redis.conf sed -i "s/# requirepass foobared/requirepass abcd1234/g" /etc/redis.conf systemctl restart redis集群部署 启动6个redis节点…...

Java日志框架-JUL

JUL全称Java util logging 入门案例 先来看着入门案例&#xff0c;直接创建logger对象&#xff0c;然后传入日志级别和打印的信息&#xff0c;就能在控制台输出信息。 可以看出只输出了部分的信息&#xff0c;其实默认的日志控制器是有一个默认的日志级别的&#xff0c;默认就…...

【Java】智慧工地SaaS平台源码:AI/云计算/物联网/智慧监管

智慧工地是指运用信息化手段&#xff0c;围绕施工过程管理&#xff0c;建立互联协同、智能生产、科学管理的施工项目信息化生态圈&#xff0c;并将此数据在虚拟现实环境下与物联网采集到的工程信息进行数据挖掘分析&#xff0c;提供过程趋势预测及专家预案&#xff0c;实现工程…...

Dodaf架构的学习分享

一.Dodaf的内容 Dodaf的背景 DODAF&#xff08;Department of Defense Architecture Framework&#xff09;起源于美国国防部&#xff0c;是一个用于支持复杂系统设计、规划和实施的架构框架。以下是DODAF的背景和起源&#xff1a; 复杂系统需求&#xff1a;在军事和国防领域&…...

听GPT 讲Prometheus源代码--discovery

Prometheus是一个开源的系统监控和警报工具包&#xff0c;以下是Prometheus源代码中一些主要的文件夹及其作用&#xff1a; cmd/&#xff1a;这个目录包含了Prometheus主要的命令行工具&#xff0c;如prometheus/&#xff0c;promtool/等。每个子目录都代表一个可执行的命令行应…...

HTTP 介绍

HTTP 介绍 HTTP 协议一般指 HTTP&#xff08;超文本传输协议&#xff09;。超文本传输协议&#xff08;英语&#xff1a;HyperText Transfer Protocol&#xff0c;缩写&#xff1a;HTTP&#xff09;是一种用于分布式、协作式和超媒体信息系统的应用层协议&#xff0c;是因特网…...

Rust语言深入解析:后向和前向链接算法的实现与应用

内容 - 第一部分 (1/3)&#xff1a; Rust&#xff0c;作为一个旨在提供安全、并行和高性能的系统编程语言&#xff0c;为开发者带来了独特的编程模式和工具。其中&#xff0c;对于数据结构和算法的实现&#xff0c;Rust提供了一套强大的机制。本文将详细介绍如何在Rust中实现后…...

快速提高写作生产力——使用PicGo+Github搭建免费图床,并结合Typora

文章目录 简述PicGo下载PicGo获取Token配置PicGo结合Typora总结 简述PicGo PicGo: 一个用于快速上传图片并获取图片 URL 链接的工具 PicGo 本体支持如下图床&#xff1a; 七牛图床 v1.0腾讯云 COS v4\v5 版本 v1.1 & v1.5.0又拍云 v1.2.0GitHub v1.5.0SM.MS V2 v2.3.0-b…...

Java方法的参数可以有默认值吗?

在日常web开发这种&#xff0c;controller层接受参数时可以通过RequestParam(requiredfalse)设置参数非必填。 所以就想Java的方法可以有非必填这种操作吗&#xff1f;网上搜了一下&#xff0c;发现不支持这种操作。 可以通过方法重载的方式来变相实现。不需要传这个参数就会…...

电子商务的安全防范

(1)安全协议问题&#xff1a;我国大多数尚处在 SSL&#xff08;安全套接层协议&#xff09;的应用上&#xff0c;SET 协议的应用还只是刚刚试验成功&#xff0c;在信息的安全保密体制上还不成熟&#xff0c;对安全协议 还没有全球性的标准和规范&#xff0c;相对制约了国际性…...

STM32开关输入控制220V灯泡亮灭源代码(附带PROTEUSd电路图)

//main.c文件 /* USER CODE BEGIN Header */ /********************************************************************************* file : main.c* brief : Main program body************************************************************************…...