第五部分:Linux中的gcc/g++以及gdb和makefile
目录
1、编译器gcc和g++
1.1、预处理(进行宏替换)
1.2、编译(生成汇编)
1.3、汇编(生成机器可识别代码)
1.4、连接(生成可执行文件或库文件)
1.5、gcc编译器的使用
2、Linux调试器-gdb使用
2.1、debug和release
2.2、gdb的使用
3、自动化构建工具make/Makefile
3.1、背景
3.2、makefile/Makefile编写
3.3、make的使用
3.4、原理
4、一些补充
1、编译器gcc和g++
gcc和g++分别是C语言和C++语言的编译器,这两个编译器的使用基本上是一样的,所以在下面只讲gcc,也就是C语言的编译器。
一个写好的C语言程序,并不能立马被执行,需要经过以下几个过程,才能生成可执行程序。编译器gcc的作用就是将写好的C程序变成可执行程序。
1. 预处理(进行宏替换)
2. 编译(生成汇编)
3. 汇编(生成机器可识别代码)
4. 链接(生成可执行文件或库文件)
1.1、预处理(进行宏替换)
预处理功能主要包括宏定义,文件包含,条件编译,去注释等。
预处理指令是以#号开头的代码行,这个阶段不会对语法进行检测。
例如:
gcc -E test01.c -o test01.i
其中以.i为后缀的文件为已经过预处理的C原始程序。
我们可以使用vim打开test01.i文件,来查看经过预处理后代码发生了什么变化。
1.2、编译(生成汇编)
在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言。
例如:
gcc -S test01.i -o test01.s
其中以.s为后缀的文件就是经过预处理和编译的C语言程序。
我们也是可以使用vim打开test.s文件,来查看代码发生的变化。
1.3、汇编(生成机器可识别代码)
汇编阶段是把编译阶段生成的“.s”文件转成目标文件。
例如:
gcc -c test01.s -o test01.o
其中以.o为后缀的文件就是经过预处理、编译、汇编后生成的目标文件。
此时,如果我们使用vim打开test01.o文件的话就会看到一堆乱码,因为里面都是二进制,所以打开后会是乱码。我们可以使用od命令来查看二进制文件。
语法:od 文件
功能:将其内容以八进制字码呈现出来。
注意:虽然目标文件已经是二进制的文件了,但是仍然需要经过链接才能执行。
1.4、链接(生成可执行文件或库文件)
在成功编译之后,就该进入链接阶段。
例如:
gcc test01.o -o test01
生成的test01文件就是可执行文件。可以使用:
./test01
来执行该可执行程序。
一个重要的概念:函数库(关于细节后面的内容再详细讲)
我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么是在哪里实“printf”函数的呢?(gcc和g++默认的头文件搜索路径就在/usr/include/)。
答案是:头文件提供方法的声明,函数库提供方法的实现。系统把这些函数实现都放到了名为 libc.so.6的库文件中去了,在没有特别指定时,gcc 会到系统默认的搜索路径/usr/lib或者/usr/lib64下进行查找(/usr/lib主要包含32位库,而 /usr/lib64则包含64位库),也就是链接到 libc.so.6库函数中去,这样就能实现函数“printf”了,而这也就是链接的作用。
函数库一般分为静态库和动态库两种:
在Linux中动态库一般是以.so为后缀的,静态库是以.a为后缀的,在Windows中动态库一般以.dll为后缀,静态库一般以.lib为后缀。
静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。
静态链接的程序优点是不依赖库,程序可以独立进行运行,缺点是体积比较大,比较消耗资源。
注意:我们的云服务器上默认只会安装动态库,静态库默认是没有的。可以使用下面的命令安装静态库。
下载C语言静态库:
sudo yum install -y glibc-static
下载C++静态库:
sudo yum install -y libstdc++-static
动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库。
动态链接的程序更加节省资源(磁盘资源、内存资源、网络资源等),缺点是动态库一旦缺失会导致各个程序都无法运行,因为会影响很多程序,包括Linux系统里面很多命令都没法运行。
如前面所述的 libc.so.6 就是动态库。gcc 在编译时默认使用动态库。
gcc默认生成的二进制程序,是动态链接的,这点可以通过之前讲的file命令验证。
例如:
file test01
运行结果中“dynamically linked”就是指动态链接。
除了file命令外,还可以使用ldd命令来查看可执行程序所依赖的动态库,例如:
ldd test01
从运行结果便可知道是静态链接还是动态链接。
1.5、gcc编译器的使用
语法:gcc [选项] 要编译的文件 [选项] [目标文件]
功能:编译C语言程序。
选项:
-E:只激活预处理。也就是让 gcc 在预处理结束后停止编译过程。
-S :该选项只进行编译而不进行汇编,生成汇编代码。
-c :编译到目标代码。使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了。
-o :后面跟目标文件,指处理后输出到哪一个文件。
-static : 此选项对生成的可执行程序采用静态链接。
注意:如果没有动态库,只有静态库,也是可以使用gcc的,gcc是可以找到静态库的,其实默认情况下,形成的程序既不是纯的动态链接也不是纯粹的静态链接,而是混合式的。如果加上了-static选项就会变成纯的静态链接。
-g :生成调试信息。GNU 调试器可利用该信息。(该选项在下面的调试部分讲)
-w :不生成任何警告信息。
-Wall: 生成所有警告信息。
2、Linux调试器-gdb使用
2.1、debug和release
程序的发布方式有两种,debug模式和release模式
Linux gcc/g++编译出来的二进制程序,默认是release模式
要使用gdb调试,必须在源代码生成二进制程序的时候, 加上-g选项。例如:
gcc test01.c -o test01 -g
也就是说在生成可执行程序时,要带上调试信息,才能使用gdb进行调试。
扩展:可执行程序有自己的二进制格式,叫做ELF格式,我们可以使用readelf命令查看这种格式,例如:
readelf -S test01
2.2、gdb的使用
语法:gdb 可执行文件
功能:调试可执行程序。
退出: ctrl + d 或 quit 或 q。
调试命令:
注意:gdb会自动记住历史命令,如果想要执行上一个命令,直接按enter键即可。
list 或 l +行号:显示可执行程序行号上下共10行源代码,默认每次接着上次的位置往下列,每次列10行。
list 或 l +函数名:列出某个函数的源代码。
r 或 run:运行程序。
break 或 b + 行号:在某一行设置断点。
break 或 b + 函数名:在某个函数开头设置断点。
注意:还可以使用下面的方式进行打断点,表示给mycode.c文件的第19行打断点,通过这种方式就可以操作多文件的调试了,例如:
b mycode.c:19
n 或 next:也就是逐过程执行。
s 或 step:也就是逐语句执行。
info break 或 info b或i b或i break:查看所有断点信息。
info break或 info b 或i b或i break+断点的编号 :查看某断点信息。
注意:断点的编号是指下图的Num下面所的序号。
finish:执行到当前函数返回,然后挺下来等待命令。当我们使用step进入某个函数后,通过观察发现这个函数没啥问题,现在想要从这个函数跳出去,而这个函数比较长,如果使用next命令单步执行到函数末尾的话就有点太慢了。 此时可以使用 finish 命令直接执行完这个函数,返回到被调用的地方。
print 或 p +变量:打印表达式的值。
例如:
p i
表示打印变量i的值。再比如:
p &i
打印变量i的地址。
set var + 变量名=值:修改变量的值。
例如:
set var i=10
把 i 变量的值改为10。
注意:这个修改变量的值是在调试的过程中修改的,不会改变源代码和可执行程序。
continue 或 c:也就是从一个断点执行到另一个断点。
delete breakpoints:删除所有断点。
delete breakpoints +断点的编号n:删除序号为n的断点。
disable breakpoints 或 enable breakpoints:禁用或启用所有断点。
disable breakpoints 或 enable breakpoints +断点编号:禁用或启用某个断点。
注意:禁用断点和删除断点不同,禁用只是不让断点发挥作用,但是断点还在;删除断点,断点就没了。
display 变量名:跟踪查看一个变量,每次停下来都显示它的值。
undisplay 序号:取消对先前设置的那些变量的跟踪。
注意:这个序号指的是变量名前面的序号,比如下面图片中的1。
until +行号:跳至某行,只能向后跳,不能向前跳。
bt:查看各级函数调用及参数,也就是查看函数的调用链。
info locals或i locals:查看当前栈帧局部变量的值。
3、自动化构建工具make/Makefile
3.1、背景
make是一个命令,makefile或Makefile是当前目录的一个文件,会不会写makefile或Makefile,从一个侧面说明了一个人是否具备完成大型工程的能力,一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile或Makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。
makefile带来的好处就是“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编 译,极大的提高了软件开发的效率。
make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE(集成开发环境)都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile或Makefile都成为了一种在工程方面的编译方法。
make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。
3.2、makefile/Makefile编写
首先先创建一个makefile或Makefile文件,然后使用vim打开该文件进行编写。
例如:此处只是举个例子,实际编写完全可以写的更精简一些。
#定义变量
cc=gcc
option=-Wall -g -std=c99 #定义目标
target=test01
object=test01.o #默认目标
all:$(target) #依赖关系和依赖方法
$(target):$(object) $(cc) $(option) -o $@ $^ %.o:%.c $(cc) $(option) -c $< #清理目标
#.PHONY:clean
clean: rm -f test01
变量定义:
Makefile 中的变量可以在整个文件中使用,便于管理和修改编译器等等
使用=来定义变量,使用 $(NAME)
来引用变量。
例如:
CC = gcc # 编译器
option=-Wall -g -std=c99 # 编译选项
再比如:
target=test01 #目标文件
object=test01.o #依赖文件
依赖关系和依赖方法
目标是你希望 make 命令帮助你生成的文件,如可执行文件等。
目标后面可以跟着一个冒号(:
)和依赖项。
例如:
all: $(target) # 默认目标
规则的格式为:
target: dependencies command
特殊变量:
$@:目标名称。
$^
:所有依赖项的名称(以空格分隔)。
$<
:第一个依赖项的名称。
例如:
$(target): $(object) $(CC) $(option) -o $@ $^
%
是一个通配符,表示相同的前缀。可以减少重复的代码,适用于一类文件的编译。
例如:
%.o: %.c $(CC) $(CFLAGS) -c $<
clean是自定义的目标,不生成任何文件,通常用于清理构建过程生成的文件。
使用 -f
选项可避免错误提示。
例如:
clean: rm -f $(TARGET) $(OBJECTS)
包含其他文件
你可以使用include 指令包含其他 Makefile,这样可以组织更复杂的项目。
例如:
include common.mk
伪目标
伪目标是指不生成文件的目标,通常用于执行清理操作等。
定义伪目标clean时可以用 .PHONY,这样即使该目录下有同名文件也不会出现混淆。
此外,.PHONY还可以用来修饰其他地方,表示总是可以被执行的(也就是说,不管源文件和目标文件的新旧关系如何,总是要执行的,具体内容看下面的原理部分)。
例如:
.PHONY:clean
3.3、make的使用
将makefile或Makefile编写好后,就可以使用make命令了。
make会自顶而下扫描makefile或Makefile文件,把所要形成的第一个目标文件充当为make的默认动作,也就是谁在前面,默认的动作就是谁。当然,我们也是可以使用make + 目标文件的这种方法来显示指定make的动作。
例如:
make
表示执行第一个目标文件的动作。
例如:
make clean
表示执行清理动作。
3.4、原理
一般而言,一定是源文件形成可执行文件,先有源文件,再有可执行文件,所以一般而言,源文件的最近修改时间比可执行文件要老。如果我们更改了源文件,历史上曾经还有对应的可执行文件,那么源文件的最近修改时间一定比可执行程序新。make会根据源文件和目标文件的新旧,来判断是否需要重新执行对应的依赖关系和依赖方法。
简单来讲就是:如果源文件老于可执行文件,则不需要重新编译,make不会执行;如果源文件新于可执行文件,则需要重新编译,make会执行。
我们可以使用stat 文件名的方式来查看一个文件的相关时间,比如最近修改时间或最近访问时间,以及文件按最近变化的时间,例如:
stat test01.c
注意:文件=文件内容+文件属性
在上面命令的运行结果中,其中modify所对应的时间是指文件内容的最近修改时间;change所对应的时间是指文件属性最近改变的时间;其中access对应的是最新的访问时间,但是受效率的影响,文件的访问时间并不会因为一次访问而改变,而是有着某种修改策略。
我们可以使用touch 已存在文件的方式把上面的三种时间都改为当前时间,例如:
touch test01.c
关于touch更多的使用方式,可以自行查阅。
1. make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
2. 如果找到,它会找文件中的第一个目标文件(target)。
3. 如果目标文件不存在,或是所依赖的文件的文件修改时间要比目标文件新,那么,他就会执行后面所定义的命令来生成目标文件。
4. 如果目标文件所依赖的文件不存在,那么make会在当前文件中找目标文件所依赖的文件的依赖性,如果找到则再根据那一个规则生成目标文件的依赖文件。
5. 这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。
6. 在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错, 而对于所定义的命令的错误,或是编译不成功,make根本不管。
7. make只管文件的依赖性,即,如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起, 我就不工作啦。
8.此外,工程是需要被清理的,像clean这种,没有与第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,不过,我们可以显示要make执行。即命令——“make clean”,以此来清除所有的目标文件,以便重编译。如果我们把clean放在了makefile或Makefile的开头的话,也是可以直接使用make来执行清理工作的。
注意:make执行的时候,会回显执行的命令,如果不想要回显的话,可以在依赖方法前加上@符号,这样就不会回显所执行的方法了。
注意:.PHONY修饰clean是为了避免该目录下存在同名文件而导致make clean无法执行,修饰其他地方是为了make可以重复执行,而不考虑时间问题,也就是说总是可以执行的。
4、一些补充
回车和换行不是一个概念:
回车是指光标移动到当前行的最左侧。
换行是指光标移动到下一行。
在C语言中,'\n' 其实执行的是回车+换行;'\r' 执行的是回车。
文件缓冲区概念(缓冲区的具体概念后面再讲),所谓的文件缓冲区就是内存的一块区域,从内存向磁盘输出的数据会先到缓冲区,缓冲区装满后或者刷新缓冲区再把数据送到磁盘上。(之前的C语言文章提过一点,可以去看C语言文件操作)。
例如:
#include<stdio.h>
#include<unistd.h> int main()
{ printf("hello world"); sleep(10); return 0;
}
编译运行后,我们会看到hello world并未立即输出到显示屏上,而是等待了10秒后,才显示出来。我们可以使用fflush()函数来刷新缓冲区,例如:
#include<stdio.h>
#include<unistd.h> int main()
{ printf("hello world"); fflush(stdout); sleep(10); return 0;
}
编译运行后,便会观察到hello world会立马输出出来。
其中sleep和fflush函数可以通过我们之前学过的man命令来查看如何使用。
注意:我们现在写的一些程序用的是linux的接口,这就导致我们写的一些程序是没法在Windows上的VS上面运行的,要注意这一点,今后有关Linux的文章基本都是如此。
相关文章:
第五部分:Linux中的gcc/g++以及gdb和makefile
目录 1、编译器gcc和g 1.1、预处理(进行宏替换) 1.2、编译(生成汇编) 1.3、汇编(生成机器可识别代码) 1.4、连接(生成可执行文件或库文件) 1.5、gcc编译器的使用 2、Linux调试器-gdb使用 2.1、debug…...
decison tree 决策树
熵 信息增益 信息增益描述的是在分叉过程中获得的熵减,信息增益即熵减。 熵减可以用来决定什么时候停止分叉,当熵减很小的时候你只是在不必要的增加树的深度,并且冒着过拟合的风险 决策树训练(构建)过程 离散值特征处理:One-Hot…...
GPU算力平台|在GPU算力平台部署AI虚拟换衣模型(CatVTON)的应用实战教程
文章目录 一、GPU算力服务平台概述智能资源分配优化的Kubernetes架构按需计费安全保障平台特色功能 二、平台账号注册流程AI虚拟换衣模型(CatVTON)的应用实战教程AI虚拟换衣模型(CatVTON)的介绍AI虚拟换衣模型(CatVTON)的部署步骤 一、GPU算力服务平台概述 蓝耘GPU算力平台专为…...
使用云服务器自建Zotero同步的WebDAV服务教程
Zotero 是一款广受欢迎的文献管理软件,其同步功能可以通过 WebDAV 实现文献附件的同步。相比 Zotero 官方提供的300MB免费存储服务,自建 WebDAV 服务具有存储空间大、成本低以及完全控制数据的优势。本文将详细介绍如何使用云服务器自建 WebDAV 服务&…...
单片机基础模块学习——按键
一、按键原理图 当把跳线帽J5放在右侧,属于独立按键模式(BTN模式),放在左侧为矩阵键盘模式(KBD模式) 整体结构是一端接地,一端接控制引脚 之前提到的都是使用了GPIO-准双向口的输出功能&#x…...
FlinkSql使用中rank/dense_rank函数报错空指针
问题描述 在flink1.16(甚至以前的版本)中,使用rank()或者dense_rank()进行排序时,某些场景会导致报错空指针NPE(NullPointerError) 报错内容如下 该报错没有行号/错误位置,无法排查 现状 目前已经确认为bug,根据github上的PR日…...
WPF基础 | WPF 基础概念全解析:布局、控件与事件
WPF基础 | WPF 基础概念全解析:布局、控件与事件 一、前言二、WPF 布局系统2.1 布局的重要性与基本原理2.2 常见布局面板2.3 布局的测量与排列过程 三、WPF 控件3.1 控件概述与分类3.2 常见控件的属性、方法与事件3.3 自定义控件 四、WPF 事件4.1 路由事件概述4.2 事…...
【AIGC学习笔记】扣子平台——精选有趣应用,探索无限可能
背景介绍: 由于近期业务发展的需求,我开始接触并深入了解了扣子平台的相关知识,并且通过官方教程自学了简易PE工作流搭建的技巧。恰逢周会需要准备与工作相关的分享主题,而我作为一个扣子平台的初学者,也想探索一下这…...
mock可视化生成前端代码
介绍:mock是我们前后端分离的必要一环、ts、axios编写起来也很麻烦。我们就可以使用以下插件,来解决我们的问题。目前支持vite和webpack。(配置超级简单!) 欢迎小伙伴们提issues、我们共建。提升我们的开发体验。 vi…...
csapp2.4节——浮点数
目录 二进制小数 十进制小数转二进制小数 IEEE浮点表示 规格化表示 非规格化表示 特殊值 舍入 浮点运算 二进制小数 类比十进制中的小数,可定义出二进制小数 例如1010.0101 小数点后的权重从-1开始递减。 十进制小数转二进制小数 整数部分使用辗转相除…...
Java面试题2025-Spring
讲师:邓澎波 Spring面试专题 1.Spring应该很熟悉吧?来介绍下你的Spring的理解 1.1 Spring的发展历程 先介绍Spring是怎么来的,发展中有哪些核心的节点,当前的最新版本是什么等 通过上图可以比较清晰的看到Spring的各个时间版本对…...
element tbas增加下拉框
使用Tabs 标签页的label插槽,嵌入Dropdown 下拉菜单,实现Tabs 标签页增加下拉切换功能 Tabs 标签页 tab-click"事件"(这个事件当中到拥有下拉框的tab里时,可以存一下Dropdown 第一个菜单的id,实现点击到拥有…...
Windows Defender添加排除项无权限的解决方法
目录 起因Windows Defender添加排除项无权限通过管理员终端添加排除项管理员身份运行打开PowerShell添加/移除排除项的命令 起因 博主在打软件补丁时,遇到 Windows Defender 一直拦截并删除文件,而在 Windows Defender 中无权限访问排除项。尝试通过管理…...
Git上传了秘钥如何彻底修改包括历史记录【从安装到实战详细版】
使用 BFG Repo-Cleaner 清除 Git 仓库中的敏感信息 1. 背景介绍 在使用 Git 进行版本控制时,有时会不小心将敏感信息(如 API 密钥、密码等)提交到仓库中。即使后续删除,这些信息仍然存在于 Git 的历史记录中。本文将介绍如何使用…...
贪心专题----
看了讲解,贪心似乎没有定式的解题方法,更多是按照常识来; 455. 分发饼干 将胃口和饼干尺寸 都排序; 然后遍历胃口,从饼干尺寸的最后一个开始。 这里为什么是遍历胃口? 当胃口大于饼干尺寸,…...
YOLOv8改进,YOLOv8检测头融合DynamicHead,并添加小目标检测层(四头检测),适合目标检测、分割等,全网独发
摘要 作者提出一种新的检测头,称为“动态头”,旨在将尺度感知、空间感知和任务感知统一在一起。如果我们将骨干网络的输出(即检测头的输入)视为一个三维张量,其维度为级别 空间 通道,这样的统一检测头可以看作是一个注意力学习问题,直观的解决方案是对该张量进行全自…...
LabVIEW项目中的工控机与普通电脑选择
工控机(Industrial PC)与普通电脑在硬件设计、性能要求、稳定性、环境适应性等方面存在显著差异。了解这些区别对于在LabVIEW项目中选择合适的硬件至关重要。下面将详细分析这两种设备的主要差异,并为LabVIEW项目中的选择提供指导。 硬件设…...
AI赋能医疗:智慧医疗系统源码与互联网医院APP的核心技术剖析
本篇文章,笔者将深入剖析智慧医疗系统的源码架构以及互联网医院APP背后的核心技术,探讨其在医疗行业中的应用价值。 一、智慧医疗系统的核心架构 智慧医疗系统是一个高度集成的信息化平台,主要涵盖数据采集、智能分析、决策支持、远程医疗等…...
一文详解Filter类源码和应用
背景 在日常开发中,经常会有需要统一对请求做一些处理,常见的比如记录日志、权限安全控制、响应处理等。此时,ServletApi中的Filter类,就可以很方便的实现上述效果。 Filter类 是一个接口,属于 Java Servlet API 的一部…...
Spring Boot - 数据库集成03 - 集成Mybatis
Spring boot集成Mybatis 文章目录 Spring boot集成Mybatis一:基础知识1:什么是MyBatis2:为什么说MyBatis是半自动ORM3:MyBatis栈技术演进3.1:JDBC,自行封装JDBCUtil3.2:IBatis3.3:My…...
力扣算法题——202.快乐数【系统讲解】
目录 💕1.题目 💕2.解析思路 本题思路总览 借助 “环” 的概念探索规律 从规律到代码实现的转化 快慢指针的具体实现 代码整体流程 💕3.代码实现 💕4.完结 二十七步也能走完逆流河吗 💕1.题目 💕2.解…...
求阶乘(信息学奥赛一本通-2019)
【题目描述】 利用for循环求n!的值。 提示,n!12...n。 【输入】 输入一个正整数n。 【输出】 输出n!的值。 【输入样例】 4 【输出样例】 24 【提示】 【数据规模及约定】 对于所有数据,1≤n≤20。 【题解代码】 #include<iostream> using namesp…...
【含代码】逆向获取 webpack chunk 下的__webpack_require__ 函数,获悉所有的模块以及模块下的函数
背景 Webpack 打包后的代码是不会直接暴露 __webpack_require__ 函数,目的是为了避免污染全局变量同时也为了保护 webpack 的打包后的模块都隐藏在闭包函数里,达到数据的安全性。 而有时我们为了测试某个函数,想直接获取这个内置函数&#…...
图生3d算法学习笔记
目录 hunyuan3d 2 stable-point-aware-3d hunyuan3d 2 https://github.com/Tencent/Hunyuan3D-2/tree/main/hy3dgen stable-point-aware-3d GitHub - Stability-AI/stable-point-aware-3d: SPAR3D: Stable Point-Aware Reconstruction of 3D Objects from Single Images...
WebSocket 心跳机制:确保连接稳定与实时性
目录 前言 什么是 WebSocket 心跳机制? WebSocket 心跳机制的实现 关键代码如下: WebSocket 心跳机制的应用场景 WebSocket 心跳机制的优势 WebSocket 心跳机制的注意事项 前言 WebSocket 是一种基于持久连接的协议,它支持全双工通信&…...
[SUCTF 2018]MultiSQL1
进去题目页面如下 发现可能注入点只有登录和注册,那么我们先注册一个用户,发现跳转到了/user/user.php, 查看用户信息,发现有传参/user/user.php?id1 用?id1 and 11,和?id1 and 12,判断为数字型注入 原本以为是简单的数字型注入,看到大…...
数据结构——AVL树的实现
Hello,大家好,这一篇博客我们来讲解一下数据结构中的AVL树这一部分的内容,AVL树属于是数据结构的一部分,顾名思义,AVL树是一棵特殊的搜索二叉树,我们接下来要讲的这篇博客是建立在了解搜索二叉树这个知识点…...
Kubernetes可视化界面
DashBoard Kubernetes Dashboard 是 Kubernetes 集群的一个开箱即用的 Web UI,提供了一种图形化的方式来管理和监视 Kubernetes 集群中的资源。它允许用户直接在浏览器中执行许多常见的 Kubernetes 管理任务,如部署应用、监控应用状态、执行故障排查以及…...
flutter_学习记录_00_环境搭建
1.参考文档 Mac端Flutter的环境配置看这一篇就够了 flutter的中文官方文档 2. 本人环境搭建的背景 本人的电脑的是Mac的,iOS开发,所以iOS开发环境本身是可用的;外加Mac电脑本身就会配置Java的环境。所以,后面剩下的就是&#x…...
【React】PureComponent 和 Component 的区别
前言 在 React 中,PureComponent 和 Component 都是用于创建组件的基类,但它们有一个主要的区别:PureComponent 会给类组件默认加一个shouldComponentUpdate周期函数。在此周期函数中,它对props 和 state (新老的属性/状态)会做一…...
vim如何设置制表符表示的空格数量
:set tabstop4 设置制表符表示的空格数量 制表符就是tab键,一般默认是四个空格的数量 示例: (vim如何使设置制表符表示的空格数量永久生效:vim如何使相关设置永久生效-CSDN博客)...
Python中程序流程的控制
本篇我们将介绍程序流程控制方面的内容,了解如何控制程序的流程,使得程序具有“判断能力”, 能够像人脑一样分析问题。在Python中,程序流程的控制主要通过以下几种方式实现: 分支语句 前言:我很熟悉分支语句…...
基于聚类与相关性分析对马来西亚房价数据进行分析
碎碎念:由于最近太忙了,更新的比较慢,提前祝大家新春快乐,万事如意!本数据集的下载地址,读者可以自行下载。 1.项目背景 本项目旨在对马来西亚房地产市场进行初步的数据分析,探索各州的房产市…...
【例51.3】 平移数据
题目描述 将a数组中第一个元素移到数组末尾,其余数据依次往前平移一个位置。 输入 第一行为数组a的元素个数; 第二行为n个小于1000的正整数。 输出 平移后的数组元素,每个数用一个空格隔开。 样例输入 复制 10 1 2 3 4 5 6 7 8 9 10 样例输出 复…...
【unity游戏开发之InputSystem——02】InputAction的使用介绍(基于unity6开发介绍)
文章目录 前言一、InputAction简介1、InputAction是什么?2、示例 二、监听事件started 、performed 、canceled1、启用输入检测2、操作监听相关3、关键参数 CallbackContext4、结果 三、InputAction参数相关1、点击齿轮1.1 Actions 动作(1)动…...
Alfresco Content Services docker自动化部署操作
Alfresco Content Services docker部署文档 前提条件 在开始之前,需要确保已经安装了 Docker 和 Docker Compose。Docker 用于创建和管理容器,Docker Compose 则用于定义和运行多容器的 Docker 应用。 步骤 1. 创建目录结构 首先,创建一个…...
侧边导航(Semi Design)
根据前几次的导航栏设计,从最简单的三行导航栏到后面响应式的导航栏,其实可以在这个的基础上慢慢优化,就可以得到一个日常使用设计的导航栏。设计步骤也和之前的类似。 一、实现步骤 1、先下载安装好npm install douyinfe/semi-icons 2、引…...
Ubuntu下让matplotlib显示中文字体
文章目录 安装中文字体显示matplotlib库的字体文件夹删除matplotlib 的缓存文件(可选) matplotlib中设置字体,显示! 参考文章: https://zodiac911.github.io/blog/matplotlib-chinese.html Ubuntu下python的matplotli…...
Linux 磁盘管理
Linux 磁盘管理 引言 磁盘管理是操作系统管理中的一项重要内容,对于Linux系统而言,磁盘管理更是基础中的基础。随着数据量的不断增加,合理地管理和利用磁盘资源显得尤为重要。本文将详细介绍Linux磁盘管理的基本概念、工具和策略,旨在帮助Linux用户和系统管理员更好地掌握…...
解决CentOS9系统下Zabbix 7.2图形中文字符乱码问题
操作系统:CentOS 9 Zabbix版本:Zabbix7.2 问题描述:主机图形中文字符乱码 解决方案: # 安装字体配置和中文语言包 sudo yum install -y fontconfig langpacks-zh_CN.noarch # 检查是否已有中文字体: fc-list :lan…...
Spring MVC (三) —— 实战演练
项目设计 我们会将前端的代码放入 static 包下: 高内聚,低耦合 这是我们在实现项目的设计思想,一个项目里存在很多个模块,每一个模块内部的要求类与类、方法与方法要相互配合紧密联系,这就是高内聚,低耦合…...
地下排水管道损害缺陷检测数据集VOC+YOLO格式2051张6类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2051 标注数量(xml文件个数):2051 标注数量(txt文件个数):2051 …...
读写和解析简单的 nc 文件
NetCDF 文件格式在气象数据工程领域占据着举足轻重的地位,其结构灵活、强兼容性等优势使其成为该领域的一个标准。无论是从事学术研究还是工程实践,掌握这种数据格式变得越发重要。其次,我注意到目前社区中气象编程大多数课程都聚焦于某个特定…...
【北京大学 凸优化】Lec1 凸优化问题定义
【北京大学 凸优化】Lec1 凸优化问题定义 前言优化问题的分类连续优化问题离散优化问题组合优化问题变分(Variational)优化问题基于限制条件的分类基于凸性的分类 前言 马上快要过年了,天气自然寒冷起来,空气中也理所当然的弥漫着…...
Spring Boot Actuator 集成 Micrometer(官网文档解读)
目录 概述 实现 Observation 可观测性 Observation 功能核心类 ObservationPredicate GlobalObservationConvention ObservationFilter ObservationHandler ObservationRegistryCustomizer Observation 相关注解 多线程处理机制 配置上下文传播 常用标签配置 Open…...
图的矩阵表示
一、邻接矩阵 长度为k的通路条数:A的k次方矩阵的所有元素和 长度为k的回路条数:A的k次方矩阵的对角线元素和 二、可达矩阵 计算使用布尔乘积 三、关联矩阵...
SpringCloud两种注册中心
SpringCloud 基本概念 系统架构 我们之前做的所有的项目都属于单体架构,下面我们将要学习更适合大型项目的分布式架构 单体架构: 将业务的所有功能几种在一个项目中开发,打成一个包部署。 优点:架构简单、部署成本低 缺点&am…...
【中间件快速入门】什么是Redis
现在后端开发会用到各种中间件,一不留神项目可能在哪天就要用到一个我们之前可能听过但是从来没接触过的中间件,这个时候对于开发人员来说,如果你不知道这个中间件的设计逻辑和使用方法,那在后面的开发和维护工作中可能就会比较吃…...
Pandas基础02(DataFrame创建/索引/切片/属性/方法/层次化索引)
DataFrame数据结构 DataFrame 是一个二维表格的数据结构,类似于数据库中的表格或 Excel 工作表。它由多个 Series 组成,每个 Series 共享相同的索引。DataFrame 可以看作是具有列名和行索引的二维数组。设计初衷是将Series的使用场景从一维拓展到多维。…...
适配Android16
Android16新特性 Android 16带来了许多新特性和改进,提升了系统的流畅度、用户体验和安全性。对于应用开发者来说,适配Android 16可以确保应用在该版本上的兼容性和性能,同时也可以利用其新特性为用户提供更好的服务。以下是Android 16的一些…...