【Linux】深刻理解动静态库
1.什么是库
- 静态库 .a[Linux]、.lib[windows]
- 动态库 .so[Linux]、.dll[windows]
2.手动制作静态库
如果我们要做一个静态库的话,首先我们需要把我们源文件(.c/.cpp)隐藏起来,头文件(.h)必须暴露出来,1.我们先要把我们所有的.c文件编译成.o文件,因为我们都知道我们正常进行程序翻译的时候,首先要做的工作就是把.c变成.o文件,最后把所有.o都链接起来。
2.把所以.o文件打包指令:ar -rcar是 Unix 和类 Unix 系统下用于创建、修改和提取归档文件的工具,ar -rc是ar命令的一个常用选项组合,其功能如下:
- -r(replace):该选项用于将文件替换或插入到归档文件中。如果归档文件中已存在同名文件,-r选项会用新文件替换旧文件;如果归档文件中不存在同名文件,则将新文件插入到归档文件中。
- -c(create):用于创建一个新的归档文件。若指定的归档文件已存在,-c选项不会报错,而是静默处理,使得ar -rc能够在归档文件不存在时创建新的归档文件,存在时进行更新操作。
语法:ar [选项] 归档文件 目标文件...
- 归档文件:指定要创建或修改的归档文件的名称,通常具有.a扩展名,如libexample.a。
- 目标文件:指定要添加到归档文件中的一个或多个源文件的名称,可以是 C、C++ 源文件,也可以是目标文件(.o文件)等。
- 静态库必须有前缀lib,后缀.a。
这个库制作好了,直接把他安装到系统里面:把我们头文件拷贝到系统特定路径里,Linux系统里默认搜索头文件路径是/usr/include![]()
然后把我们库也要安装到系统里,默认路径一般是/lib64/![]()
这样静态库和头文件都被安装到系统中去了,所以Linux系统中,所有的安装本质就是拷贝。
3.手动调用我们自己的静态库
然后试试别人能不能直接使用头文件中的方法:创建一个other目录:![]()
![]()
#include<my_stdio.h> #include<my_string.h> #include<stdio.h> int main() {const char *a = "abcdf";printf("%s: %d\n",a,my_strlen(a));myFILE *fp =mfopen("./log.txt","a");if(fp ==NULL) return 1;mfwrite(a,my_strlen(a),fp);mfwrite(a,my_strlen(a),fp);mfwrite(a,my_strlen(a),fp);mfclose(fp);return 0; }
为什么会链接报错呢?因为编译器找不到,那同样是库,那为什么那么多库,能找到libc.aC语言的库呢?为什么不要告诉编译器呢?所以那是因为gcc是编C语言的,他默认要认识C标准库的,我们刚才写的库叫第三方库,如何要让编译器认识?刚才头文件和库都拷贝到系统,都能被找到,但是库有那么多,究竟应该链接哪一个库呢,所以
-l 这个l就是link(链接),然后库名libmystdio.a取掉前缀后缀就是stdio,所以这样就能找到库,并且能使用
-l就是引入指定名称的第三方库。我们也可以不用把这些安装到系统里,别人直接给我们提供了头文件和库,这时我们该怎么使用呢?
指令:gcc main.c -o main -L. -lstdio-L 告诉编译器,编译的时候,查找库,除了在系统路径下查找,也要在指定路径下查找
- gcc:是 GNU Compiler Collection 的缩写,是一个广泛使用的开源编译器套件,支持多种编程语言,这里主要用于编译 C 语言程序。
- main.c:是要编译的源文件,通常包含 C 语言的源代码。
- -o main:-o选项用于指定输出文件的名称,这里将编译后的可执行文件命名为main。如果不使用-o选项,默认的输出文件名是a.out。
- -L.:-L选项用于指定库文件的搜索路径。这里的.表示当前目录,即告诉编译器在当前目录下搜索库文件。
- -lstdio:-l选项用于指定要链接的库。这里的stdio是库的名称(去掉lib前缀和.a或.so后缀),编译器会在-L指定的路径(这里是当前目录)下搜索名为libstdio.a或libstdio.so的库文件,并将其链接到可执行文件中。
所以我们把库写好了,库里面应不应该有没有main函数?1.库里面绝对不能有main函数, 如果库中也有main 函数,那么在链接库到其他程序时,就会出现多个main 函数,这会导致链接错误,因为程序不知道该从哪个main 函数开始执行。2.库我们在发布的时候,我们建议,把所有的头文件放在include目录下,把我们库放在lib64目录下。
通过makefile来制作静态库:![]()
libmystdio.a:my_stdio.o my_string.oar -rc $@ $^ %.o:%.cgcc -c $< .PHONY:clean clean:rm -f *.a *.o
发布我们写的库:指令:tartar是 Unix 和类 Unix 系统中常用的归档工具,用于将多个文件或目录打包成一个归档文件,也可以从归档文件中提取文件或目录。以下是关于tar的详细介绍:基本功能
- 打包:可以将多个文件和目录组合成一个单一的归档文件,方便存储、传输和备份。
- 压缩:通常与压缩工具(如gzip、bzip2等)结合使用,在打包的同时进行压缩,减小文件占用的存储空间。
- 解压:从归档文件中恢复出原始的文件和目录结构。
常用命令选项
- -c(create):创建新的归档文件。例如:tar -cvf archive.tar file1 file2 dir1,这会将file1、file2和dir1打包到archive.tar中。
- -x(extract):从归档文件中提取内容。例如:tar -xvf archive.tar,会将archive.tar中的文件和目录提取到当前目录。
- -t(list):列出归档文件中的内容,但不提取。例如:tar -tvf archive.tar,会显示archive.tar中包含的文件和目录列表。
- -f(file):指定归档文件的名称。这个选项必须紧跟在-c、-x或-t之后,后面跟上归档文件的路径和名称。
- -z(gzip):使用gzip进行压缩或解压。例如:tar -czvf archive.tar.gz file1 file2,会创建一个gzip压缩的归档文件archive.tar.gz;tar -xzvf archive.tar.gz,会解压gzip压缩的归档文件。
- -j(bzip2):使用bzip2进行压缩或解压。例如:tar -cjvf archive.tar.bz2 file1 file2,会创建一个bzip2压缩的归档文件archive.tar.bz2;tar -xjvf archive.tar.bz2,会解压bzip2压缩的归档文件。
libmystdio.a:my_stdio.o my_string.oar -rc $@ $^ %.o:%.cgcc -c $< .PHONY:clean clean:rm -rf *.a *.o stdc .PHONY:output output:mkdir -p stdc/includemkdir -p stdc/libcp -f *.h stdc/includecp -f *.o stdc/libtar -czf stdc.tgz stdc
操作使用:
然后怎么使用呢?
- gcc:GNU Compiler Collection 的缩写,是一个广泛使用的编译器,用于编译 C 语言等程序。
- main.c:要编译的源文件,其中包含了 C 语言的源代码。
- -o main:-o选项用于指定输出文件的名称,这里将编译后的可执行文件命名为main。如果不使用-o选项,默认的输出文件名是a.out。
- -I stdc/include:-I(大写的 i)选项用于指定头文件的搜索路径。这里告诉编译器在stdc/include目录下搜索main.c中#include指令所包含的头文件。例如,如果main.c中有#include "myheader.h",编译器会在stdc/include目录中查找myheader.h文件。
- -L stdc/lib:-L选项用于指定库文件的搜索路径。这意味着编译器会在stdc/lib目录下搜索后续-l选项指定的库文件。
- -l mystdio:-l(小写的 L)选项用于指定要链接的库。这里的mystdio是库的名称(去掉lib前缀和.a或.so后缀),编译器会在-L指定的路径(即stdc/lib)下搜索名为libmystdio.a或libmystdio.so的库文件,并将其链接到可执行文件main中。
![]()
4.手动制作动态库
动态库前缀也要加lib,后缀加.sogcc/g++不仅能形成可执行程序,还能形成动态库gcc -shared 用于生成共享库(shared library),在 Linux 和类 Unix 系统中,共享库是一种可执行代码的二进制形式,能被多个程序同时使用,以节省内存并实现代码复用。形成动态库时,形成.o的过程要新增一个选项 -fPIC,形成与位置无关码-fPIC是 GCC 编译器中的一个重要选项,全称为 “Position - Independent Code”,即生成位置无关代码。以下从多个方面详细介绍它:
1. 作用原理
在编译生成共享库(shared library)或可执行文件时,程序的代码和数据在内存中的加载位置会影响指令的执行。传统的可执行文件在编译时,代码中的内存地址引用是基于固定的加载地址计算的。但共享库比较特殊,它可能被多个不同的程序加载到不同的内存地址空间运行。-fPIC选项会让编译器生成的代码,不依赖于特定的内存加载地址。编译器通过使用相对地址而不是绝对地址来引用数据和代码,这样生成的代码可以在内存的任意位置加载执行,而不需要在加载时进行重定位(relocation)。
2. 为何重要
- 共享库的需求:共享库是为多个程序所共享的代码集合。如果没有-fPIC生成位置无关代码,那么每个使用该共享库的程序在加载共享库时,都需要对共享库中的代码进行重定位,这不仅增加了加载时间,而且还可能导致内存使用效率低下。通过-fPIC,共享库可以在不同进程的地址空间中共享相同的物理内存页面,极大地节省了内存资源。
- 动态链接的基础:现代操作系统普遍采用动态链接机制,允许程序在运行时动态加载所需的共享库。-fPIC生成的代码使得动态链接过程更加高效和灵活,能够适应不同的内存布局和加载场景。
![]()
libmystdio.so:my_stdio.o my_string.ogcc -o $@ $^ -shared %.o:%.cgcc -c $< -fPIC .PHONY:clean clean:rm -rf *.so *.o stdc
指令:ldd
ldd是一个在 Linux 和类 Unix 系统中非常有用的命令,主要用于查看程序运行时所依赖的共享库(shared libraries)。
1. 基本语法
ldd [选项] <文件名>其中,<文件名>是要检查的可执行文件或共享库的名称,选项可以用来获取更详细或特定格式的输出。3. 常用选项
- -v(详细模式)
- 提供更详细的信息,包括共享库的版本号、加载的起始地址等。
4.输出解释
ldd
的输出通常包含以下信息:
- 库名称:这是程序或共享库所依赖的动态库的名称,通常以
lib
开头,以.so
结尾。- 库的完整路径:显示了动态库在文件系统中的实际位置。如果显示
not found
,表示该动态库未找到,这可能会导致程序无法正常运行。- 库的地址:显示了该动态库在内存中的加载地址。这通常在运行时由动态链接器分配,对于大多数用户来说,这个信息可能不太重要,除非你正在进行一些系统级的调试。
3.如果把动态库删了,可执行程序会怎么样?
- 立即崩溃(在某些情况下)
- 如果可执行程序在启动时就需要加载被删除的动态库,并且系统无法找到合适的替代库来满足依赖关系,那么程序在启动阶段就会崩溃。例如,一个程序依赖于一个特定版本的图形库来进行界面初始化,当这个图形库动态文件被删除后,程序在启动时尝试加载该库就会失败,从而无法正常启动。
- 这是因为动态库中的函数和数据是在程序运行时按需加载的,当找不到所需的动态库时,操作系统无法完成程序的初始化过程
- 运行时出错
- 即使程序成功启动,如果在运行过程中需要调用被删除的动态库中的函数,也会出现错误。例如,一个计算程序在运行过程中需要调用动态库中的数学计算函数,当动态库被删除后,一旦执行到调用该函数的代码部分,就会出现 “无法找到动态库” 或 “无法解析符号(函数名)” 等错误。
- 这种情况通常会导致程序的部分功能失效或者直接崩溃,具体取决于程序对该动态库的依赖程度以及如何处理动态库加载失败的情况。有些程序可能会有一定的错误处理机制,能够在检测到动态库缺失时给出友好的错误提示并尝试恢复或继续执行其他功能,但很多程序没有这样的机制,就会直接异常终止。
如果把静态库删了,可执行程序会怎么样?
- 基本不受影响(一般情况)
- 当可执行程序链接了静态库后,库中的代码和数据会在编译和链接阶段被复制到可执行文件中。所以,在程序已经成功生成后,删除静态库通常不会影响可执行程序的正常运行。
- 例如,一个简单的 C 语言程序main.c链接了一个静态库libmath.a(其中包含了一些数学计算函数)来计算数值。在编译链接过程中,gcc main.c -o main -L. -lmath(假设库在当前目录下),libmath.a中的相关代码被整合进了main这个可执行文件。之后,即使删除了libmath.a,main依然可以正常运行,因为它已经拥有了运行所需的全部代码。
同时存在动静态库,默认用的是动态库,除非加 -static
一、默认使用动态库
- 编译时:
在类 Unix 系统(如 Linux)中,当同时存在一个库的静态版本(例如libexample.a
)和动态版本(例如libexample.so
),并且在编译链接可执行程序时没有特别指定使用静态库,编译器通常会默认使用动态库。例如,如果你有以下命令:gcc main.c -L. -lexample -o main
这里-L.
表示在当前目录查找库文件,-lexample
表示链接libexample
库,编译器会优先使用libexample.so
(如果存在),因为这是默认行为。这是因为使用动态库可以节省磁盘空间和内存,因为多个程序可以共享同一个动态库,并且在更新库时,只需要更新动态库而不需要重新编译程序。二、使用静态库
- 使用
-static
选项:
如果你想强制使用静态库,可以使用-static
选项。例如:gcc main.c -L. -lexample -o main -static
此命令将强制编译器使用静态库libexample.a
而不是libexample.so
进行链接。这样,最终生成的可执行程序将包含静态库的代码,而不依赖于外部的动态库,其优点是可执行程序的独立性更强,可在不同环境中运行而不依赖于特定的库版本,但缺点是可执行程序的体积会变大。三、库搜索顺序
- 搜索顺序:
- 编译器首先会搜索动态库。如果没有使用
-static
选项,它会优先使用动态库。- 编译器会根据
-L
选项指定的路径查找库文件。如果没有使用-L
,则会按照系统的默认库搜索路径查找,通常包括/usr/lib
、/usr/local/lib
等。- 对于动态库,系统会在运行时根据
LD_LIBRARY_PATH
环境变量、/etc/ld.so.conf
文件和系统默认的库路径来查找所需的动态库。四、注意事项
- 库命名规则:
静态库通常以.a
结尾,动态库通常以.so
结尾(在 Linux 系统中)。库的名称通常遵循lib<库名>.<后缀>
的格式,例如libexample.a
和libexample.so
。- 性能和空间权衡:
- 动态库:
- 优点:多个程序可以共享同一个动态库,节省磁盘空间和内存,更新库时不需要重新编译程序。
- 缺点:可能存在兼容性问题,如果库版本不兼容,可能导致程序无法正常运行。
- 静态库:
- 优点:可执行程序不依赖于外部库,可在不同环境中稳定运行。
- 缺点:可执行程序体积较大,每个程序都包含一份库的副本。
相关文章:
【Linux】深刻理解动静态库
1.什么是库 库是写好的现有的,成熟的,可以复⽤的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个⼈的代码都从零开始,因此库的存在意义⾮同寻常。本质上来说库是⼀种可执⾏代码的⼆进制形式,可以被操作系统载…...
【spring 事务】事务的基本使用,事务隔离级别、事务传播机制
在Spring框架中,声明式事务管理是一种通过注解或配置文件自动管理事务的方式,而不需要手动编写事务管理代码。Transactional是Spring提供的一个注解,用于声明式事务管理,它使得事务的管理变得简单而清晰。 主要特性 自动事务管理…...
arkime 和elasticsearch安装方法二
这次试一下新的办法 先下载centOS 7 然后改成阿里云镜像 输入命令备份官方yum源配置文件 cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak 下载阿里云源配置,覆盖原文件 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirr…...
GitCode 助力 AutoTable:共创 MyBatis 生态的自动表格管理新篇章
项目仓库https://gitcode.com/dromara/auto-table 解放双手,专注业务:MyBatis 生态的“自动表格”创新 AutoTable 是一款致力于为 MyBatis 生态赋予“自动表格”功能的创新插件。其核心理念是通过 Java 实体类自动生成和维护数据库的表结构,…...
日历热力图,月度数据可视化图表(日活跃图、格子图)vue组件
日历热力图,月度数据可视化图表,vue组件 先看效果👇 在线体验https://www.guetzjb.cn/calanderViewGraph/ 日历图简单划分为近一年时间,开始时间是 上一年的今天,例如2024/01/01 —— 2025/01/01,跨度刚…...
ue5 制作,播放,停止动画蒙太奇
右键,动画蒙太奇 新建插槽 把默认插槽选择为,自己新建的插槽 然后拖一个动画进去 input换成玩家0 就可以接收键盘事件 pawn 自动控制玩家换成玩家0 找到动画蓝图 把它化成我们那边蒙太奇里面的槽 第三步:第三人称角色蓝图 按下F…...
Genetic Prompt Search via Exploiting Language Model Probabilities
题目 利用语言模型概率的遗传提示搜索 论文地址:https://www.ijcai.org/proceedings/2023/0588.pdf 项目地址:https://github.com/zjjhit/gap3 摘要 针对大规模预训练语言模型(PLMs)的即时调优已经显示出显著的潜力,尤其是在诸如fewshot学习…...
mysql之表的外键约束
MySQL表的外键约束详细介绍及代码示例 外键约束是数据库中用于维护数据完整性和一致性的重要机制。它确保一个表中的数据与另一个表中的数据相关联,防止无效的数据引用。本文将详细介绍了外键约束的各个方面,并通过具体的代码示例进行演示。 1. 外键约束…...
linux环境变量配置文件区别 /etc/profile和~/.bash_profile
在 Linux 系统中,环境变量可以定义用户会话的行为,而这些变量的加载和配置通常涉及多个文件,如 ~/.bash_profile 和 /etc/profile。这些文件的作用和加载时机各有不同。以下是对它们的详细区别和用途的说明: 文章目录 1. 环境变量…...
C++----STL(vector)
vector的介绍 vector的文档介绍:cplusplus.com/reference/vector/vector/ 1.基本概念 简单来说,vector是表示可以改变大小的数组的顺序容器。使用连续的存储位置来存储元素,因此可以通过常规指针的偏移量来高效访问。 2.内部机制 vector…...
springboot项目适配电科金仓数据库
又接到了信创适配任务,话不多说,直接开始干货 首先安装一下电科金仓的数据库,直接官网下,对应的授权也下90天的专业版,客户肯定是整个采购,365天的开发版本连接数有限制 KES相关下载地址:电科金仓-成为世界卓越的数据库产品与服务提供商 安装就不做赘述了 启动数据库…...
C# 动态创建Label和ComboBox控件并修改Text获取Text
背景:在做项目的时候可能需要根据一定数量创建某些控件并修改其属性,本文以控件label、ConboBox控件进行动态创建。 程序运行前后的的Form动态图 代码如下: using System; using System.Collections.Generic; using System.ComponentModel; …...
HP 笔记本重新安装 Windows 11 无法启动
相信你搜到这篇文章的时候, 你已经看过了网上各种关于如何在 HP 笔记本电脑上安装 Windows 11 的文章。你遇到的问题肯定不是网上那些文章讲的那么简单的问题。你遇到的一定不是你不懂如何安装 Windows,不懂如何对硬盘分区等等小白问题。 问题描述 问…...
BUUCTF_Web( XSS COURSE 1)xss
XSS即跨站脚本攻击(Cross-Site Scripting),是一种常见的网络安全漏洞. 定义 XSS攻击指攻击者在目标网站中注入恶意脚本,当用户访问该网站时,浏览器会执行这些恶意脚本,从而导致用户信息泄露、被控制等安全问…...
STM32补充——IAP
0 前置知识: FLASH相关内容:前往STM32补充——FLASH STM32三种烧录方式(看看就行): 1.ISP:In System Programming(在系统编程) 执行芯片厂商的 Bootloader 程序进入 ISP 模式&…...
APP加固的那些事
APP加固是保护APP代码逻辑的重要手段,通过隐藏、混淆、加密等操作提高软件的逆向成本,降低被破解的几率,保障开发者和用户利益。本文将介绍APP加固常见失败原因及解决方法,以及处理安装出现问题的情况和资源文件加固策略选择。 引…...
数据分析 基础定义
一、大数据的定义 数据分析是基于商业等目的,有目的的进行收集、整理、加工和分析数据,提炼有价值信息的过程。 大数据分析即针对海量的、多样化的数据集合的分析 大数据分析是一种利用大规模数据集进行分析和挖掘知识的方法。随着互联网、社交媒体、移动…...
PyTorch广告点击率预测(CTR)利用深度学习提升广告效果
目录 广告点击率预测问题数据集结构广告点击率预测模型的构建1. 数据集准备2. 构建数据加载器3. 构建深度学习模型4. 训练与评估 总结 广告点击率预测(CTR,Click-Through Rate Prediction)是在线广告领域中的重要任务,它帮助广告平…...
嵌入式入门(二)-STM32CubeMX项目开发
使用STM32CubeMX创建项目 本文使用STM32CubeMX模拟器创建一个嵌入式项目的详细流程。 New Project 根据型号搜索 搜索型号: STM32F103C8T6 启动项目 选择STM32F103C8T6后点击 Start Project 配置时钟 切换到 Clock Configuration 修改HCLK -->72MHZ 修改Input fr…...
MATLAB绘图时线段颜色、数据点形状与颜色等设置,介绍
MATLAB在绘图时,设置线段颜色和数据点的形状与颜色是提高图形可读性与美观性的重要手段。本文将详细介绍如何在 MATLAB 中设置这些属性。 文章目录 线段颜色设置单字母颜色表示法RGB 值表示法 数据点的形状与颜色设置设置数据点颜色和形状示例代码 运行结果小结 线段…...
Java菜鸟养成计划(java基础)--java运算符
java中的运算符 1、java中的运算符1.1 、 、-、 * 、/ 、 %1.2 、、-、 *、/、%1.3 、、--【自增\自减运算符】1.4、>、 <、 > 、< 、 、! 、! 1.5、&&、||、|、&1.6、&、|、~、^1.7、>> 、 <<、>>>位运算1.8、?:三目运算符…...
学习笔记——动态规划
递推 1.递推和动态规划有什么关系? 递推问题包括动态规划,动态规划一定是递推,递推不一定是动态规划。 动态规划是一种决策性的问题,是在状态中做最优决策的一种特殊递推算法,通常的问法包括求最大最小值等ÿ…...
蓝桥杯备考:红黑树与map和set
搜索二叉树 我们三种树只了解原理,不写代码,因为我们竞赛不做要求,只是为了使用set和map做铺垫 原理记不住,没关系,我们只要会各种操作的时间复杂度 二叉搜索树的定义 1若左子树非空,左子树所有结点的权…...
第二届生成式人工智能与信息安全国际学术会议(GAIIS 2025)
在线投稿: 学术会议-学术交流征稿-学术会议在线-艾思科蓝 【征文主题】(包括但不限于) 深度学习 自然语言处理 算法应用 计算机视觉 视觉识别 模式识别 强化学习 生成对抗网络 生成建模技术 语言预训练 视觉预训练 联合预训练…...
后端面试题分享第一弹(状态码、进程线程、TCPUDP)
后端面试题分享第一弹 1. 如何查看状态码,状态码含义 在Web开发和调试过程中,HTTP状态码是了解请求处理情况的重要工具。 查看状态码的步骤 打开开发者工具: 在大多数浏览器中,您可以通过按下 F12 键或右键单击页面并选择“检查…...
Python 常用运维模块之OS模块篇
Python 常用运维模块之OS模块篇 OS 模块获取当前工作目录更改当前工作目录返回当前目录路径返回上一级目录路径递归生成目录路径删除目录创建目录删除目录列出特定目录下文件和子目录删除某个特定文件重命名某个文件获取某个文件/目录的信息输出目录路径分隔符输出文件行终止符…...
前沿技术趋势洞察:2024年技术的崭新篇章与未来走向!
引言 时光飞逝,2024年已经来临,回顾过去一年,科技的迅猛进步简直让人目不暇接。 在人工智能(AI)越来越强大的今天,我们不再停留在幻想阶段,量子计算的雏形开始展示它的无穷潜力,Web …...
HTML语言的数据结构
HTML语言的数据结构 引言 HTML(超文本标记语言)是构建网页的标准语言。尽管HTML本身不是一种编程语言,它为我们提供了一种结构化的信息表示方法,使得网页内容能够有序地展现给用户。HTML的核心在于其标记(标签&#…...
怎么创建一个能在线测试php的html5网页?
代码示例: 一、搭建服务器环境 首先,你需要在服务器上搭建 PHP 运行环境。如果你使用的是 Linux 服务器,可以使用 Apache 或 Nginx 作为 Web 服务器,并安装 PHP 解释器。对于 Windows 服务器,可以使用 WAMP(…...
docker安装elk6.7.1-搜集nginx-json日志
docker安装elk6.7.1-搜集nginx-json日志 如果对运维课程感兴趣,可以在b站上、A站或csdn上搜索我的账号: 运维实战课程,可以关注我,学习更多免费的运维实战技术视频 0.规划 192.168.171.130 nginxfilebeat 192.168.171.131 …...
常见的社交媒体平台有哪些?
社交媒体平台有哪些?在跨境电商和全球营销的过程中,海外社交媒体平台是提高品牌曝光率的重要工具。为了有效管理多个平台的账户,并防止账户之间的关联问题,OKBrow指纹指纹浏览器凭借其强大的多账户管理、防关联技术和隐私保护功能…...
nslookup在内网渗透的使用
1. 什么是 nslookup? nslookup(Name Server Lookup)是一个用于查询 DNS(域名系统)记录的命令行工具。通过该工具,用户可以查询域名的解析结果,例如获取某个域名对应的 IP 地址或查找域名的相关记…...
Linux:修改用户名
Linux:修改用户名 0. 注意事项1.创建并切到临时用户tempuser2.更改用户名3.删除临时用户tempuser 更多内容:XiaoJ的知识星球 在Ubuntu系统中,更改用户名。 0. 注意事项 备份重要数据:在更改用户名之前,建议备份重要数…...
IP协议特性
在网络层中,最重要的协议就是IP协议,IP协议也有两个特性,即地址管理和路由选择。 1、地址管理 由于IPv4地址为4个字节,所以最多可以支持42亿个地址,但在现在,42亿明显不够用了。这就衍生出下面几个机制。…...
开发环境搭建-3:配置 nodejs 开发环境 (fnm+ node + pnpm)
在 WSL 环境中配置:WSL2 (2.3.26.0) Oracle Linux 8.7 官方镜像 node 官网:https://nodejs.org/zh-cn/download 点击【下载】,选择想要的 node 版本、操作系统、node 版本管理器、npm包管理器 根据下面代码提示依次执行对应代码即可 基本概…...
14_音乐播放服务_字典缓存避免重复加载
首先在游戏根入口下创建空节点 F2重命名为BGAudio 作为播放 背景音乐的对象 在BGAudio对象上挂载组件 AudioSource 关掉PlayOnAwake 因为我们需要通过代码来控制音效 音量大小设置为0.5 Ctrl d 再复制一份背景播放对象BGAudio 重命名为UIAudio 作为UI窗口操作的播放对象 创建…...
pgsql中处理数组类型字段
1、代码中存入和读取 需要使用自定义转换器 Slf4j public class ArrayTypeHandler extends BaseTypeHandler<List<String>> {Overridepublic void setNonNullParameter(PreparedStatement ps, int i, List<String> parameter, JdbcType jdbcType)throws SQL…...
新年好(Dijkstra+dfs/全排列)
1135. 新年好 - AcWing题库 思路: 1.先预处理出1,a,b,c,d,e到其他点的单源最短路,也就是进行6次Dijkstra 2.计算以1为起点的这6个数的全排列,哪种排列方式所得距离最小,也可以使用dfs 1.Dijkstradfs #define int long longusing …...
vscode导入模块不显示类型注解
目录结构: utils.py: import random def select_Jrandom(i:int, m:int) -> int:"""随机选择一个不等于 i 的整数"""j iwhile j i:j int(random.uniform(0, m))return jdef clip_alpha(alpha_j:float, H:float, L:f…...
Stable diffusion 都支持哪些模型
Stable Diffusion 支持多种模型,主要包括以下几类: 官方基础模型: SD 1.x 系列(如 Stable Diffusion 1.4、1.5):这是最经典的模型,适合多种通用场景,使用简单且易于上手。SD 2.x 系列…...
C语言操作符(上)
操作符 一,操作符的分类1,算数操作符2,赋值操作符3,逻辑操作符4,条件操作符4,单目操作符5,函数调用和下表访问操作符 二,原码反码补码三,移位操作符1,左移操作…...
Linux TCP 之 RTT 采集与 RTO 计算
我们来看看 Linux TCP 采集 RTT 的函数 tcp_rtt_estimator,看注释,充满了胶着。 但在那个谨慎的年代,这些意味着什么? RTT 最初仅用于 RTO 的计算而不是用于调速,RTO 的计算存在两个问题,如果过估&#x…...
智慧水务管网在线监测平台(Axure高保真原型)
智慧水务管网在线监测平台是一种集成了物联网、大数据、云计算和人工智能等技术的综合管理系统。平台的主要目的是提高水务管理的效率和安全,确保供水系统的稳定运行。 智慧水务管网在线监测平台的主要特点和功能: 综合监测与管理:智慧水务平…...
Kubernetes 架构图和组件
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:历代文学,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编程,高并发设计…...
不建模,无代码,如何构建一个3D虚拟展厅?
在数字化浪潮的推动下,众多企业正积极探索线上3D虚拟展厅这一新型展示平台,旨在以更加生动、直观的方式呈现其产品、环境与综合实力。然而,构建一个既专业又吸引人的3D虚拟展厅并非易事,它不仅需要深厚的技术支持,还需…...
MMDetection学习系列(5)——Mask R-CNN深度探索与实战指南
目录 实例分割 R-CNN系列 R-CNN Fast R-CNN Faster R-CNN Mask R-CNN Mask R-CNN 头部结构细节 两阶段架构 损失函数 掩码 RoIAlign Faster R-CNN中的RoIPool Mask R-CNN 中的RoIAlign 实例分割实验 消融研究 定性结果 SOTA 方法比较 Coovally AI模型训练与…...
Oracle SQL: TRANSLATE 和 REGEXP_LIKE 的知识点详细分析
目录 前言1. TRANSLATE2. REGEXP_LIKE3. 实战 前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 1. TRANSLATE TRANSLATE 用于替换字符串中指定字符集的每个字符,返回替换后的字符串 逐一映射输入字…...
PHP语言的软件工程
PHP语言的软件工程 引言 软件工程是计算机科学中的一个重要分支,它涉及软件的规划、开发、测试和维护。在现代开发中,PHP作为一种流行的服务器端脚本语言,广泛应用于网页开发和各种企业应用中。本文将深入探讨PHP语言在软件工程中的应用&am…...
量变引起质变
量变引起质变,这个是最本质的规律,重复进行一件事情,这件事情就会越来越完善,越来越完美,哪怕是菜鸟,重复多了就是大佬。 我从说话结结巴巴,到说话流畅,只是用了15天直播写代码&…...
【专题】为2025制定可付诸实践的IT战略规划报告汇总PDF洞察(附原数据表)
原文链接:https://tecdat.cn/?p39055 在当今瞬息万变的商业环境中,制定有效的 IT 战略规划对于企业的成功与可持续发展至关重要。本报告深入探讨了制定 IT 战略规划的关键活动,旨在为企业和决策者提供全面且实用的指导。 Gartner的《为202…...