makefile总结
Makefile
学习视频:1、野火的基础入门篇-第32讲 Makefile三要素_哔哩哔哩_bilibili
2、b站视频04 一个稍复杂的Makefile_哔哩哔哩_bilibili
学习资料:第2个视频对应的Make/make.md · 无限十三年/CPP - 码云 - 开源中国
ch0_Makefile简介
Makefile是什么?
通过make工具和Makefile去管理需要编译的文件
make和Makefile是什么关系?
- make工具:找出修改过的文化,根据依赖关系,找出受影响的相关文件,最后按照规则单独编译这些文件。
- Makeflie文件:记录依赖关系和编译规则
makefile总览
ch1_Makefile三要素
Makefile三要素是什么?
目标、依赖、命令
怎么描述三要素?
目标:依赖的文件或者是其他目标
命令1
命令2
…
命令可以多行,但是前面必须加tap
字符
实验演示
targeta:targetb targetcecho "targeta"
targetb:echo "targetb"
targetc:echo "tarfetc"mzj@ubuntu:~/Makefile$ make
echo "targetb"
targetb
echo "targetc"
targetc
echo "targeta"
targeta
mzj@ubuntu:~/Makefile$ make targetb
echo "targetb"
targetb
mzj@ubuntu:~/Makefile$ make targetc
echo "targetc"
targetc
.PHONY:目标
需要注意当文件路径下有跟目标
相同的文件名时,想要make不被影响,应该在Makefile文件的开头加上.PHONY:目标名
原因:
.PHONY
后面跟的目标都被称为伪目标- 也就是说我们
make
命令后面跟的参数如果出现在.PHONY
定义的伪目标中,那就直接在Makefile
中就执行伪目标的依赖和命令。不管Makefile
同级目录下是否有该伪目标同名的文件,即使有也不会产生冲突。 - 另一个就是提高执行
makefile
时的效率。
.PHONY:targetb
targeta:targetb targetcecho "targeta"
targetb:echo "targetb"
targetc:echo "targetc"mzj@ubuntu:~/Makefile$ ls
Makefile targetb targetc
mzj@ubuntu:~/Makefile$ make targetc
make: “targetc”已是最新。
mzj@ubuntu:~/Makefile$ make targetb
echo "targetb"
targetb
ch2_Makefile变量
系统变量
Makefile_test文件
.PHONY:allall:echo "$(CC)"echo "$(AS)"echo "$(MAKE)"echo "$(MAKE)"mzj@ubuntu:~/Makefile$ make -f Makefile_test
echo "cc"
cc
echo "as"
as
echo "make"
make
echo "make"
make
这里的make -f 指定Makefile文件名字,针对这个这个文件,可能有很多Makefile_test
自定义变量
-
=
:延迟赋值,执行到这个变量时才赋值Makefile_test1文件 A = 123 B = $(A) A = 456.PHONY:all all:echo "$(B)"mzj@ubuntu:~/Makefile$ make -f Makefile_test1 Makefile_test1:7: *** 遗漏分隔符 (null)。 停止。 !!!!!!!这里是tap建被vscode换成4个空格了,需要设置!!!!!!! #这里是执行到$(B)时,B才执行B = $(A) 456 mzj@ubuntu:~/Makefile$ make -f Makefile_test1 echo "456" 456
-
:=
:为立即赋值,与常规思路一样A = 123 B := $(A) A = 456.PHONY:all all:echo "$(B)"mzj@ubuntu:~/Makefile$ make -f Makefile_test1 echo "123" 123
-
?=
:空赋值,只有变量为空时,赋值才有效,后面再赋值没有用,像是一次初始化A ?= 123 A ?= 456.PHONY:all all:echo "$(A)"mzj@ubuntu:~/Makefile$ make -f Makefile_test1 echo "123" 123
-
+=
:追加赋值,不覆盖前面的,在前面的值基础上在尾部继续追加一些值A ?= 123 A += 456.PHONY:all all:echo "$(A)"mzj@ubuntu:~/Makefile$ make -f Makefile_test1 echo "123 456" 123 456
自动化变量
$<
:第一个依赖文件first_tar
$^
:全部的依赖文件first_tar second_tar
$@
:目标all
all:first_tar second_tarecho "$<"echo "$^"echo "$@"
first_tar:
second_tar:mzj@ubuntu:~/Makefile$ make -f Makefile_test1
echo "first_tar"
first_tar
echo "first_tar second_tar"
first_tar second_tar
echo "all"
all
Makefile中还有其它自动化变量,此处仅列出方便以后使用到的时候进行查阅,见下表。
符号 | 意义 |
---|---|
$@ | 匹配目标文件 |
$% | 与 @ 类似,但 @类似,但 @类似,但%仅匹配“库”类型的目标文件 |
$< | 依赖中的第一个目标文件 |
$^ | 所有的依赖目标,如果依赖中有重复的,只保留一份 |
$+ | 所有的依赖目标,即使依赖中有重复的也原样保留 |
$? | 所有比目标要新的依赖目标 |
使用变量编译C文件
CC = gcc
TARGET=mp3
OBJS=main.o mp3.o$(TARGET):$(OBJS)$(CC) $^ -o $@main.o:$(CC) -c main.c -o main.o
mp3.o:$(CC) -c mp3.c -o mp3.o .PHONY:cleanclean:rm $(TARGET)
ch3_Makefile模式匹配和默认规则
-
%
:匹配任意多个非空字符.PHONY:all%:@echo "$@"@echo "$^"@echo "$<" # @ 符号的作用是抑制命令本身的输出,只显示命令执行的结果。mzj@ubuntu:~/Makefile$ make make: *** 无目标。 停止。 mzj@ubuntu:~/Makefile$ make 123 123
@
符号的作用是抑制命令本身的输出,只显示命令执行的结果。命令行输入给了
%
这个位置再看这个模板:这里的.c文件到.o文件的形式基本上一样的,就可以使用模式匹配
%
去代替CC = gcc TARGET=mp3 OBJS=main.o mp3.o$(TARGET):$(OBJS)$(CC) $^ -o $@main.o:main.c$(CC) -c main.c -o main.o mp3.o:mp3.c$(CC) -c mp3.c -o mp3.o ||| %.o:%.c$(CC) -c $< -o $@.PHONY:cleanclean:rm $(TARGET)
这里的
%.o
:包含了所有的.o
文件 -
默认规则:
.o
文件默认使用.c
文件进行编译,所以可以直接不管.o
文件,下面即可CC = gcc TARGET=mp3 OBJS=main.o mp3.o$(TARGET):$(OBJS)$(CC) $^ -o $@.PHONY:cleanclean:rm $(TARGET) *.o
-
默认规则还有很多:后续补充
ch4_Makefile条件分支
ifeq(var1,var2)...
else...
endififneq(var1,var2)...
else...
endif
ifeq
:两个条件相等
ifneq
:两个条件不相等里面需要加上
搭配?=
进行举例
ARCH ?= x86
ifeq($(ARCH),x86)CC = gcc
elseCC = arm-linux-gnueabihf-gcc
endif
TARGET=mp3
OBJS=main.o mp3.o$(TARGET):$(OBJS)$(CC) $^ -o $@.PHONY:cleanclean:rm $(TARGET) *.omzj@ubuntu:~/Makefile$ make
那么,CC = gcc
mzj@ubuntu:~/Makefile$ make ARCH=arm
由于空赋值,命令行中就给ARCH赋值了,CC = arm-linux-gnueabihf-gcc
ch5_Makefile常用函数
很多看官方手册
这里挑四个常用的
- patsubst
patsubst
作用,例如把一堆
.c
文件名转成.o
文件名有两种方法:
objects = foo.o bar.o baz.o
$(objects:.c=.o)
$(patsubst %.o,%.c,$(objects))
- 第一种看起来,更直观,更简洁
$(patsubst %.c,%.o,x.c.c bar.c)
把字串“x.c.c bar.c”中以.c 结尾的单词替换成以.o 结尾的字符。函数的返回结果是“x.c.o bar.o”
$(patsubst %.c, build_dir/%.o, hello_main.c )
#函数的输出为:
build_dir/hello_main.o
#执行如下函数
$(patsubst %.c, build_dir/%.o, hello_main.xxx )
#由于hello_main.xxx不符合匹配规则"%.c",所以函数没有输出
例如:
我们存在一个代表所有.o 文件的变量。定义为
objects = foo.o bar.o baz.o
为了得到这些.o 文件所对应的.c 源文件。我们可以使用以下两种方式的任意一个:
$(objects:.o=.c)$(patsubst %.o,%.c,$(objects))
notdir
作用,把路径去了,只保留文件名
示例:
$(notdir src/foo.c hacks)
foo.c hacks
返回值为:这里的src/
被去掉了,只留下foo.c hacks
。
wildcard
作用:列出当前目录下所有符合模式“PATTERN”格式的文件名。
“PATTERN”使用shell可识别的通配符,包括“?”(单字符)、“*”(多字符)等。
示例:
$(wildcard *.c)#在sources目录下有hello_func.c、hello_main.c、test.c文件
#执行如下函数
$(wildcard sources/*.c)
#函数的输出为:
sources/hello_func.c sources/hello_main.c sources/test.c
返回值为当前目录下所有.c
源文件列表
foreach
我们来看一个例子,实现了将变量“files”赋值为目录“dirs”下所有文件列表:
dirs := a b c d
files := $(foreach dir,$(dirs),$(wildcard $(dir)/*))
例子中,表达式第一次执行时将展开为
$(wildcard a/*)
;第二次执行时将展开为$(wildcard b/*)
;第三次展开为$(wildcard c/*)
;….;以此类推。所以此函数所实现的功能就和一下语句等价:
files := $(wildcard a/* b/* c/* d/*)
ch6_多级结构工程的Makefile
接下来我们使用上面三个函数修改我们的Makefile,以适应包含多级目录的工程,修改后的内容如下所示。
#定义变量
#ARCH默认为x86,使用gcc编译器,
#否则使用arm编译器
ARCH ?= x86
TARGET = hello_main#存放中间文件的路径
BUILD_DIR = build_$(ARCH)
#存放源文件的文件夹
SRC_DIR = sources
#存放头文件的文件夹
INC_DIR = includes .#源文件
SRCS = $(wildcard $(SRC_DIR)/*.c)
#目标文件(*.o)
OBJS = $(patsubst %.c, $(BUILD_DIR)/%.o, $(notdir $(SRCS)))
#头文件
DEPS = $(wildcard $(INC_DIR)/*.h)#指定头文件的路径
CFLAGS = $(patsubst %, -I%, $(INC_DIR))#根据输入的ARCH变量来选择编译器
#ARCH=x86,使用gcc
#ARCH=arm,使用arm-gcc
ifeq ($(ARCH),x86)
CC = gcc
else
CC = arm-linux-gnueabihf-gcc
endif#目标文件
$(BUILD_DIR)/$(TARGET): $(OBJS)$(CC) -o $@ $^ $(CFLAGS)#*.o文件的生成规则
$(BUILD_DIR)/%.o: $(SRC_DIR)/%.c $(DEPS)
#创建一个编译目录,用于存放过程文件
#命令前带“@”,表示不在终端上输出
@mkdir -p $(BUILD_DIR)
$(CC) -c -o $@ $< $(CFLAGS)#伪目标
.PHONY: clean cleanall
#按架构删除
clean:rm -rf $(BUILD_DIR)#全部删除
cleanall:rm -rf build_x86 build_arm
ch7_同一项目中有多个Makefile文件
包含其他makefile文件
使用include
指令可以读入其他makefile文件的内容,效果就如同在include的位置用对应的文件内容替换一样。
include mkf1 mkf2 # 可以引入多个文件,用空格隔开
include *.mk # 可以用通配符,表示引入所有以.mk结尾的文件
如果找不到对应文件,则会报错,如果要忽略错误,可以在include
前加-
-include mkf1 mkf2
应用实例:自动生成依赖
objs = block.o command.o input.o main.o scene.o test.osudoku: $(objs)g++ $(objs) -o sudokuinclude $(objs:%.o=%.d)%.d: %.cpp@-rm $@$(CXX) -MM $< > $@.temp@sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.temp > $@@-rm $@.temp%.o : %.cppg++ -c $<@echo $^
嵌套make
如果将一个大项目分为许多小项目,则可以使用嵌套(递归)使用make。具体做法为,写一个总的Makefile,然后在每个子项目中都写一个Makefile,在总Makefile中进行调用。
例如,可以把sudoku项目中除main.cpp,test.cpp外的其他cpp存为一个子项目,编译为一个库文件,main.cpp test.cpp为另一个子项目,编译为.o然后链接库文件成可执行文件:
库文件Makefile
vpath %.h ../includeCXXFLAGS += -I../include -fexec-charset=GBK -finput-charset=UTF-8cpps := $(wildcard *.cpp)
objs := $(cpps:%.cpp=%.o)libsudoku.a: $(objs)ar rcs $@ $^$(objs): %.o : %.cpp %.h
main.cpp test.cpp的Makefile
CXXFLAGS += -I../include -fexec-charset=GBK -finput-charset=UTF-8
vpath %.h ../include
vpath %.a ../lib../sudoku: main.o test.o -lsudoku$(CXX) -o $@ $^
总的Makefile
.PHONY: all cleanall: subsrcsubsrc: sublib$(MAKE) -C srcsublib:$(MAKE) -C libclean:-rm *.exe src/*.o lib/*.o lib/*.a
其中
$(MAKE) -C subdir
这一指令会自动进入subdir文件夹然后执行make。
可以通过export
指令向子项目的make传递变量。
export var # 传递var
export # 传递所有变量
unexport # 取消传递
相关文章:
makefile总结
Makefile 学习视频:1、野火的基础入门篇-第32讲 Makefile三要素_哔哩哔哩_bilibili 2、b站视频04 一个稍复杂的Makefile_哔哩哔哩_bilibili 学习资料:第2个视频对应的Make/make.md 无限十三年/CPP - 码云 - 开源中国 ch0_Makefile简介 Makefile是什…...
MIME 类型是个什么东西?
MIME 类型(Multipurpose Internet Mail Extensions)即多用途互联网邮件扩展类型,它是一种标准,用于表示文档、文件或字节流的性质和格式。 最初设计用于电子邮件系统,后来被广泛应用于网页、HTTP 协议等领域࿰…...
javaWeb开发---前后端开发全景图解(基础梳理 + 技术体系)
在现代互联网开发中,前端与后端的分工协作非常重要。本文结合实际架构图,全面梳理前端技术栈、后端技术栈以及服务器端整体流程,帮助初学者建立清晰的整体认知。 一、整体架构概览 系统整体划分为三个主要部分: B端(…...
spring-rabbit的CachingConnectionFactory默认参数导致消费者Channel数量暴增问题解决
文章目录 1.前言2.解决2.1消费监听方法中关闭channel2.2 配置设置两个参数 3.总结 1.前言 由于之前写了一个好用的rabbitmq-spring-boot-start启动器,后面在生产实践之后反馈消费者连接的Channel数量过多,一个消费者的Channel数量可以达到好几百…...
线上JVM调优与全栈性能优化 - Java架构师面试实战
线上JVM调优与全栈性能优化 - Java架构师面试实战 本文通过一场互联网大厂的Java架构师面试,深入探讨了线上JVM调优、OOM定位、死锁定位、内存和CPU调优、线程池调优、数据库调优、缓存调优、网络调优、微服务调优及分布式调优等关键领域。 第一轮提问 面试官&am…...
【KWDB创作者计划】_企业级多模数据库实战:用KWDB实现时序+关系数据毫秒级融合(附代码、性能优化与架构图)
一、技术背景与行业痛点 1.1 多模数据融合挑战 场景痛点: 工业物联网设备每秒产生百万级传感器数据(时序数据)。需关联设备档案(关系数据)生成设备健康报告,传统方案需多数据库跳转,延迟>5…...
“八股训练营”学习总结
在参加为期 40 天的八股训练营的这段时间里,我收获满满,不仅在知识技能上得到了提升,更在学习习惯和自我认知方面有了很大的进步。 在知识层面,训练营涵盖了网络、数据库、缓存以及python测试开发等多方面的知识点。 网络方面&a…...
java工具类
LocalDateTime LocalDateTime可以获取当前时间: LocalDateTime now LocalDateTime.now(); 同时他也可以获取指定时间: LocalDateTime dateTime LocalDateTime.of(2023, 5, 15, 10, 30) 若我们时间值超出了我们的实际情况值,我们将会出现…...
「OC」源码学习——alloc与init的实现
「OC」源码学习——alloc与init的实现 前言 费劲千辛万苦终于项目给写完了,进入下一个阶段,源码的学习 alloc的调用顺序 我们在main函数之中打上断点,先运行 再在alloc之中的各个函数之中打上断点,在关键步骤上打上断点&#…...
AOSP Android14 Launcher3——动画核心类QuickstepTransitionManager详解
Launcher3中,有一个类在跟桌面相关的各种动画中扮演着非常关键的角色,这个类就是QuickstepTransitionManager。 QuickstepTransitionManager在aosp中的路径为:aosp/packages/apps/Launcher3/quickstep/src/com/android/launcher3/QuickstepT…...
STM32:看门狗
独立看门狗 简介 独立看门狗(IWDG)由独立的低速时钟(LSI)驱动,即便主时钟发生故障,它依然能够正常工作。其主要作用是在程序出现异常时,通过复位来保障系统的稳定性。独立看门狗的喂狗操作相对…...
第十三步:vue
Vue 1、上手 1、安装 使用命令:npm create vuelatestvue文件后缀为.vueconst app createApp(App):初始化根组件app.mount("#app"):挂载根组件到页面 2、文件 script标签:编写jstemplate标签:编写htmls…...
《代码整洁之道》第8章 边界 - 笔记
甚至是你团队里其他组写的你无法随意修改的代码。 这些外部代码是你的**“边界”。它们可能会升级、可能会有 Bug、可能会有反人类的设计、甚至你将来可能想换一个类似的库或服务。如果你的应用代码直接且紧密地依赖**这些外部代码的具体类、方法、异常等细节,那么…...
【CF】Day45——Codeforces Round 1021 (Div. 2) BC
阅读理解。。。不过挺有意思( B. Sasha and the Apartment Purchase 题目: 思路: 看了半天没看懂... 题目叽里咕噜一大堆,说白了就是让我们在一个 可删除k个数 的 数组 中选 一些点 且 这些点的f(x) 是此时 删完了k个数之后的数组…...
《代码整洁之道》第5章 格式 - 笔记
你应该选择一套管理代码格式的简单规则。如果是团队,应该选择一套团队一致同意采用的简单格式规则。 最重要的原则:一致性(Consistency)! 没有完美的格式规范,但有统一的规范。 整个团队(或者…...
通过示例学习:连续 XOR
通过示例学习:连续 XOR 如果我们想在 PyTorch 中构建神经网络,可以使用 (with) 指定所有参数(权重矩阵、偏差向量),让 PyTorch 计算梯度,然后调整参数。但是,如果我们有很…...
加密算法 AES、RSA、MD5、SM2 的对比分析与案例(AI)
加密算法 AES、RSA、MD5、SM2 的对比分析 一、相同点 密码学基础 均为现代密码学核心算法,用于保障数据安全。数据处理 均涉及数据转换(加密、签名、哈希等)。密钥依赖 AES、RSA、SM2 依赖密钥(对称或非对称&#x…...
基于STM32、HAL库的MAX31865模数转换器ADC驱动程序设计
一、简介: MAX31865是一款高精度的铂电阻温度检测器(RTD)至数字转换器,具有以下特点: 支持2线、3线或4线RTD配置 15位ADC分辨率 可编程RTD和基准电阻 内置故障检测(开路、短路等) SPI接口通信 工作电压:3.0V至3.6V 二、硬件接口: STM32L4XX <--> MAX31865 PA5(SCK…...
Laravel5.7的一些用法
1、事件需要运行 php artisan queue:work 2、数据库对象关联 1对1 hasOne 1对多 hasMany 1依赖多 belongsTo 多依赖多 belongsToMany 3、 关联查询 with 关联统计 withCount 统计时指定字段名。 如: withCount([cardHolderOrders as order_count]); 4、 // 一次查询&…...
Vue3 + OpenLayers 开发教程 (六)WebGL渲染优化
1. WebGL 渲染优化 1.1 WebGL 渲染器配置 创建 src/utils/webgl.ts: import { Map } from ol; import { WebGLPointsLayer } from ol/layer; import { Vector as VectorSource } from ol/source; import { Style, Circle, Fill, Stroke } from ol/style;// 创建 …...
【C++】C++11新特性(一)
文章目录 列表初始化initializer_list左值引用和右值引用 列表初始化 在 C98 中可以使用{}对数组或者结构体元素进行统一的列表初始值设定 struct Point {int _x;int _y; }; int main() {int array1[] { 1, 2, 3, 4, 5 };int array2[5] { 0 };Point p { 1, 2 };return 0; …...
【网络原理】 网络编程套接字
文章目录 一、网络编程基础1. 为什么需要网络编程?2. 什么是网络编程3 .网络编程中的基本概念发送端和接收端请求和响应客户端和服务端 4. 常见的客户端服务端模型 二、Socket套接字1. 概念2.分类3. Java数据报套接字通信模型4.Java流套接字通信模型 三、UDP数据报套…...
每天五分钟深度学习框架pytorch:使用visdom绘制损失函数图像
visdom的安装 pip install visdom如果安装失败 pip install --upgrade visdom开启visdom python -m visdom.server nohup python -m visdom.server后台启动然后就会出现,下面的页面,我们可以使用下面的链接打开visdom页面 Visdom中有两个重要概念: env环境。不同环境的可…...
【MySQL专栏】MySQL数据库表的内外连接
文章目录 1、表的内连接(1)内连接的语法格式①显示SMITH的名字和部门名称 2、外连接(1)左外连接左外连接的语法格式通过实例演示: (2)右外连接右外连接的语法格式通过实例演示 1、表的内连接 什…...
-信息革命-
信息革命-马歇尔麦克卢汉(MARSHALL McLUHAN),1964年 随着大系统的加速崩溃,作为塑造经济生活和收入分配的一个因素,系统性的强 制将会式微。很快,在社会机构的组织中,效率将会比权力的分配更加重…...
Charles 抓包入门教程
一、什么是 Charles? Charles 是一款功能强大的抓包工具,可以拦截、查看、分析电脑和手机上的 HTTP/HTTPS 网络请求。常用于: 查看网页或App发送的请求和返回的数据调试接口、分析问题模拟网络环境(断网、慢速网络)修…...
深度学习新趋势:利用MLP取代卷积层——S2-MLPv2模型解析
深度学习新趋势:利用MLP取代卷积层——S2-MLPv2模型解析 近年来,深度学习领域不断涌现出新的技术革新,而其中最引人注目的趋势之一就是用多层感知机(MLP)替代传统的卷积层。这种转变不仅带来了计算效率的提升…...
【玩转 JS 函数式编程_016】DIY 实战:巧用延续传递风格(CPS)重构倒计时特效逻辑
文章目录 巧用延续传递风格(CPS)重构倒计时特效逻辑1 起因2 换一种思路3 填坑之旅4 复盘与小结 写在前面 都说念念不忘,必有回响。写过的文章也好,看过的视频也罢,其实只要用心积累,不必刻意去死记硬背&…...
虚函数表的设计和多态的实现
虚表指针 类直接定义虚函数:编译器自动在对象头部插入 vptr。 继承含虚函数的父类:子类复用父类的 vptr,不会创建新的vptr 单继承(子类继承一个含虚函数的父类) 1.创建新的虚函数表 2.沿用父类的虚表指针ÿ…...
中国科学院大学计算机考研历年初试分数线分析以及计算机所考的科目有哪些?
以下是对中国科学院大学计算机考研历年初试分数线分析以及计算机所考科目的介绍: 历年初试分数线分析 • 2024 年 :计算机应用技术专业(专业代码 081203)和计算机技术专业(专业代码 085404)的复试分数线为…...
Simulink与C的联合仿真调试
背景 simulink的Matlab Function,默认采用double类型的数据,无法定制int或者single类型的数据;Simulink中的Matlab Function直接调用.m文件中的函数(该函数中对数据类型有single或者int的定义),该函数中的…...
DeepSeek 多头潜在注意力(Multi-Head Latent Attention, MLA)技术
1. 核心原理 多头潜在注意力(MLA)是Transformer架构的扩展技术,通过潜在空间投影和多注意力头并行计算增强模型对长序列和复杂特征的建模能力。 1.1 关键技术点 潜在空间压缩 将原始高维注意力矩阵投影到低维潜在空间,降低计算复…...
C# 类(Class)教程
在现代面向对象编程中,**类(Class)**是最基础、最重要的概念之一。通过学习类,我们可以理解怎样定义自己的数据类型,封装数据与行为,构建复杂的软件体系结构。本文将详细介绍C#中的类,从基础定义…...
Kubernetes学习笔记-环境变量的使用
如果项目需要一些灵活配置,减少硬编码或者避免敏感信息的暴露,可以考虑使用Kubernetes Pod下的容器的环境变量。 Pod容器设置环境变量的方式: 可以通过Deployment配置文件的env字段来设置环境变量 value env:- name: ACTIVE_PROFILEvalue: …...
git提交规范记录,常见的提交类型及模板、示例
Git提交规范是一种约定俗成的提交信息编写标准,旨在使代码仓库的提交历史更加清晰、可读和有组织。以下是常见的Git提交类型及其对应的提交模板: 提交信息的基本结构 一个标准的Git提交信息通常包含以下三个主要部分: Header:描…...
关于指针和指针算术
第一次读C primer plus 第六版时,关于指针的语法一些名词没有用心去理解,再读的时候,讲到指针算术这个词时,感觉之前读像是漏了很关键的点,这次读,写下关于指针算术的思考。 有漏了的感觉是,在…...
el-input限制输入只能是数字 限制input只能输入数字
方法一: 通过设置type属性:type“number”,这种方式一般会影响样式,不建议使用,如下图: <el-input type"number" v-model"aaa"></el-input>方法二: 通过绑定值…...
Pydantic:校验器(@validator)、模型嵌套、模型继承
📚 1. 校验器(validator) Pydantic 允许你自定义字段验证逻辑。用 validator 装饰器可以在字段赋值时自动进行检查或修改。 例子: from pydantic import BaseModel, validatorclass User(BaseModel):name: strage: intvalidato…...
343. 整数拆分
给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。 示例 1: 输入: 2输出: 1解释: 2 1 1, 1 1 1。 示例 2: 输入: 10输出: 36解释: 10 3 3 4, 3 3 4 36。说明: 你可以假设 n 不小于 2…...
前端面试 js
作用域链 内存管理 垃圾回收器 引用计数 默认栈里面会有一次引用 问题:循环引用,会产生内存泄漏 标记清除 垃圾回收期会定期从根开始遍历,找到有引用的对象 闭包 内存泄漏 this的指向 默认绑定 独立调用的this都是window function foo()…...
Linux CentOS 安装Python 3.8.0
在 CentOS 上升级 Python 3.6.8 到 3.8.0,可以按照以下步骤操作: 1. 安装依赖 sudo yum groupinstall -y "Development Tools" sudo yum install -y openssl-devel bzip2-devel libffi-devel zlib-devel wget 如果遇到报错“File "/bin…...
EXCEL常用函数公式和VBA汇总第二篇
系列文章目录 文章目录 系列文章目录前言一、excel公式应用1.rand函数2.rand函数随机排序3.rand函数提取数据4.correl函数5.SUBSTITUTE函数6.MAX组合函数7.分析下班时间8.柏拉图自动排序 总结 前言 一、excel公式应用 1.rand函数 用excel生成1-5的随机数字,其中对…...
Python 基础核心知识
1. Python 特点 简洁易读:代码简洁,强制缩进(取代花括号)。动态类型:变量无需声明类型(如 x 10)。跨平台:支持 Windows、Linux、macOS。丰富的库:如 NumPy(…...
软考:软件设计师考试数据结构知识点详解
文章目录 1. 引言1.1 数据结构的重要性1.2 软件设计师考试中数据结构的考察目标 2. 基本概念和术语2.1 数据结构的定义2.2 算法和数据结构的关系2.3 抽象数据类型(ADT) 3. 线性结构3.1 数组3.1.1 数组的定义和特点3.1.2 数组的存储结构3.1.3 数组的优缺点…...
11前端项目总结----详情页放大镜和轮播图
商品详情页 DOM元素尺寸和位置相关属性1. 尺寸相关属性2.位置相关属性3.鼠标事件相关位置属性 放大镜排他Swiper和组件通信 DOM元素尺寸和位置相关属性 1. 尺寸相关属性 ①offsetWidth/offsetHeight:内容宽度/高度paddingborder(滚动条) ②c…...
Linux课程五课---Linux进程认识1
作者前言 🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂 🎂 作者介绍: 🎂🎂 🎂 🎉🎉🎉…...
Nacos简介—4.Nacos架构和原理一
大纲 1.Nacos的定位和优势 2.Nacos的整体架构 3.Nacos的配置模型 4.Nacos内核设计之一致性协议 5.Nacos内核设计之自研Distro协议 6.Nacos内核设计之通信通道 7.Nacos内核设计之寻址机制 8.服务注册发现模块的注册中心的设计原理 9.服务注册发现模块的注册中心的服务数…...
splitchunk(如何将指定文件从主包拆分为单独的js文件)
1. 说明 webpack打包会默认将入口文件引入依赖js打包为一个入口文件,导致这个文件会比较大,页面首次加载时造成加载时间较长 可通过splitchunk配置相应的规则,对匹配的规则打包为单独的js,减小入口js的体积 2. 示例 通过正则匹配ÿ…...
MCP+A2A协议终极指南:AI系统构建技术全解析(医疗/金融实战+Streamable HTTP代码详解)
简介 2025年,MCP协议与A2A协议成为AI系统互联的核心技术。本文从通信机制到企业级应用,结合Streamable HTTP、零信任安全、多模态处理等最新技术,提供Go/Python/Java多语言实战代码,覆盖医疗诊断、金融风控等场景。含15+完整案例、性能优化方案及安全架构设计,助你掌握下…...
关于定时任务原理
关于定时任务原理 计算机是怎么计时的关于本地定时任务实现小根堆实现时间轮实现 关于分布式任务的实现管理未来的执行时间点 今天来聊一下工作中经常使用的定时任务的底层实现原理 计算机是怎么计时的 计算机内部使用多种方式来计时,主要依赖于硬件时钟࿰…...