️代码的华尔兹:在 Makefile 的指尖上舞动自动化的诗篇

文章目录
- 😶🌫️😶🌫️😶🌫️背景——一个优秀工程师必备技能😶🌫️😶🌫️😶🌫️
- 一、🤩🤩快速了解make与Makefile核心思想🤩🤩
- 1. 快速见一面
- 2. 具体语法——Makefile
- 3. 具体语法——make
- 二、🥳🥳.PHONY原理解释🥳🥳
- 1. ACM时间
- 2. make对比时间
- 3. 回到.PHONY
- 4. Make 的智能编译机制的好处
- 三、😴😴makefile会自行推导😴😴
- 1. 现象分析——自行推导
- 2. 原理解释
- 3. Make 的默认工作流程
- 四、❤️❤️必看!!!❤️❤️逐层深入构建万能通用Makefile模板❤️❤️
- 1. 初代改进——.c到.o
- 2. 二代进阶版本——类似宏定义
- 3. ❤️❤️❤️! ! ! 最终版本——多文件通配 ! ! !❤️❤️❤️
- 4. 适度扩展的语法
- 👍👍👍总结: Makefile 的好处👍👍👍
😶🌫️😶🌫️😶🌫️背景——一个优秀工程师必备技能😶🌫️😶🌫️😶🌫️
关于 Makefile 的重要性
-
Makefile 的掌握与工程能力
是否会编写 Makefile,从某种程度上反映了一个人是否具备完成大型工程项目的能力。它不仅是一个编译文件,更是一种有效的项目管理工具。 -
工程中的文件管理与编译规则
在工程项目中,源文件通常按类型、功能或模块组织在不同的目录中。Makefile 定义了一系列规则,指定文件的编译顺序与依赖关系,包括:- 哪些文件需要优先编译
- 哪些文件需要重新编译
- 更复杂的功能操作
-
自动化编译的优势
Makefile 的最大优势在于实现“自动化编译”。一旦编写完成,仅需一个make命令,即可完成整个项目的自动编译,大大提高了开发效率。 -
工具支持
Make 是一种解释 Makefile 指令的命令工具,广泛应用于各种 IDE,例如:- Delphi 的 make
- Visual C++ 的 nmake
- Linux 下的 GNU make
因此,Makefile 已成为工程项目中的主流编译方法。
-
Make 与 Makefile 的配合
Make 是一条命令,而 Makefile 是一个配置文件。两者相互配合,可实现项目的自动化构建与高效管理。

一、🤩🤩快速了解make与Makefile核心思想🤩🤩
1. 快速见一面
问:make与Makefile是什么呢?
答:make是一个命令,Makefile是一个指令。

2. 具体语法——Makefile
Makefile 语法基础
-
依赖关系与依赖方法
Makefile 的核心语法就是“依赖关系 + 依赖方法”。这两者决定了文件编译的顺序和方式。- 依赖关系:某个文件(称为“目标”)需要其他文件(称为“依赖”)准备好才能编译。例如,
main.o: main.c utils.h表示main.o依赖于main.c和utils.h。换句话说,在生成main.o之前,main.c和utils.h必须是最新的。 - 依赖方法:告诉 Makefile 如何生成目标文件的具体指令。例如,
gcc -c main.c -o main.o指明如何生成main.o文件。Makefile 会执行这些方法来自动编译项目。
- 依赖关系:某个文件(称为“目标”)需要其他文件(称为“依赖”)准备好才能编译。例如,
-
.PHONY的作用
.PHONY是 Makefile 中的一个特殊指令,用来定义“伪目标”,即它不会检查文件的时间戳,只会直接执行定义的命令。- 用法:比如
.PHONY: clean表示clean是个伪目标。这样在执行make clean时,无论有没有名为clean的文件,Makefile 都会直接运行clean目标的命令,而不去判断文件是否最新。 - 作用:让依赖方法始终被执行,而不受文件的更新情况影响。这在清理文件、初始化环境等操作中尤其有用。
- 用法:比如
以上,大家其实都不用看,J桑带大家把这些换成人话😉😉😉
我们生活中有这样的场景:
对于mytest来说:

对于这里clean来说:

这里.PHONY的作用是,它所修饰的clean是一个伪目标,所以clean被依赖的方法总是被执行。
3. 具体语法——make
make默认执行Makefile中第一个,也可以make后家对应的目标名(targetname),那么就执行对应的目标。

带.PHONY的目标可以重复执行,不带.PHONY的目标只能执行一次:

二、🥳🥳.PHONY原理解释🥳🥳
1. ACM时间
我们使用stat命令可以看到一个文件的ACM时间:

在 stat 命令的输出中,我们可以看到文件的三个主要时间属性:
-
Access Time(atime) - 访问时改变时间
表示文件最后一次被读取的时间。任何对文件内容的读取(如打开文件查看)都会更新这个时间,但文件的属性和内容不会因此改变。A时间不是每一次访问都被修改,这样有效降低了IO,一般可能访问10次会做一次修改。 -
Modify Time(mtime) - 修改内容改变时间
表示文件内容最后一次被修改的时间。如果文件的内容发生变化(例如文件被编辑或写入新数据),mtime就会更新。一般来说M时间变化了,代表文件被修改,而一般文件被修改,它的大小等等可能会变,因此C时间会跟着变化。 -
Change Time(ctime) - 修改属性改变时间
表示文件元数据最后一次被更改的时间。例如,修改文件的权限、所有者或文件名都会更新ctime。注意,ctime反映的是文件状态的变化,而不是文件内容的直接修改。
2. make对比时间
当你运行 make 时,Make 会检查源文件和生成的可执行文件的时间戳。工作流程如下:
-
初次执行
在源文件和可执行文件都存在的情况下,Make 会对比它们的时间戳。如果源文件比可执行文件更新,说明源代码被修改过,Make 将重新编译生成可执行文件。 -
重复执行
此时源文件如果没有被修改过,bin的时间比较新,他就不会去执行make(即没有更新),再次执行make时不会重新编译,节省了重复编译的时间。如果源文件被修改过了,源文件的时间就会更新,比bin的时间更新,因此就可以执行。 -
执行
make clean
使用make clean时,定义的清理规则会删除生成的文件(如可执行文件、目标文件等),清理掉这些文件的时间戳记录。 -
重新生成可执行文件
由于make clean删除了之前生成的可执行文件,再次执行make时,系统找不到这些文件,于是会重新编译并生成可执行文件。
通过这种时间戳的比对机制,make 实现了智能编译,即只在必要时重新编译文件,从而加快开发流程。

3. 回到.PHONY
make比较的是原文件与可执行程序的M时间,
因此,PHONY修饰的目标原理是忽略了时间的比较,它的方法总是被执行。
以下是优化后的内容,进一步阐明了 make 的时间戳比对机制和 .PHONY 的作用及好处:
4. Make 的智能编译机制的好处
-
避免不必要的编译,提升效率
make通过源文件和可执行文件的时间戳对比,判断哪些文件需要重新编译。这种机制确保只有在源文件发生更改时才会触发编译,从而节省时间、降低 CPU 和 I/O 资源消耗。 -
减少错误和不一致
这种机制也降低了手动编译可能产生的版本不一致或遗漏文件更新的风险。编译流程变得更可靠,确保了最新的源代码得到正确的编译。
三、😴😴makefile会自行推导😴😴
1. 现象分析——自行推导
Makefile 能够自行推导多个依赖目标的生成步骤,使得我们可以从一份源文件自动构建出最终的可执行文件。例如,以下代码展示了从 test.c 文件逐步生成可执行文件 mytest 的过程:
我们有这样的依赖关系:

依赖关系会自动推导如下:

最终可以执行:

2. 原理解释
这种逐步生成的编译流程可以理解为依赖栈的原理。make 会依次推导每个目标文件的依赖关系,将最底层的依赖按顺序编译生成最终的目标文件 mytest。过程如下:
- 查找依赖:当执行
make mytest时,make会检查mytest的依赖项(即test.o)是否存在且最新。 - 向下递归:如果
test.o不存在或不是最新,make会检查test.o的依赖test.s是否存在且最新。 - 逐层构建:依次向下直到最底层的
test.c,按顺序执行编译命令:test.c生成test.i(预处理)test.i生成test.s(汇编代码生成)test.s生成test.o(汇编)test.o最终生成mytest(链接)

通过make的自动推导机制,我们可以通过依赖栈的形式按需生成目标文件,而无需手动编写每一步的命令。
以下是对内容的优化:
3. Make 的默认工作流程
当只输入 make 命令时,make 将按照默认方式执行以下步骤:
-
查找 Makefile 文件
make会在当前目录中寻找名为Makefile或makefile的文件。 -
定位第一个目标文件
找到 Makefile 文件后,make会将其中定义的第一个目标(target)文件作为最终的构建目标。例如,上例中,make会将myproc作为最终生成的文件。 -
检查目标文件及依赖项时间
如果myproc文件不存在,或者它依赖的文件(例如myproc.o)有较新的修改时间,make将执行 Makefile 中定义的命令来生成myproc。 -
递归生成依赖项
如果myproc的依赖文件myproc.o不存在,make会继续查找myproc.o的生成规则。这会递归地查找依赖,直到找到一个存在的文件或底层源文件,例如.c文件。 -
编译生成目标
当make找到底层源文件(如.c文件)时,便会执行对应的命令来生成依赖文件,如myproc.o,再继续编译生成最终目标myproc。 -
逐层查找依赖关系
make逐层检查和生成每一层的依赖,直到最终生成第一个目标文件。这种递归查找和编译依赖的过程类似于一个栈结构。 -
错误处理
在查找或生成的过程中,如果某个关键文件缺失,make会退出并报错。如果是执行命令时出现错误,例如编译失败,make将跳过该命令继续查找其他依赖关系。 -
依赖关系管理
make只管理文件的依赖关系。如果在解析依赖关系时无法找到某个依赖文件,make将终止工作,不会执行进一步的命令。
这种依赖机制让 make 仅在必要时重新编译文件,从而简化了构建流程,避免了重复编译,提高了效率。
四、❤️❤️必看!!!❤️❤️逐层深入构建万能通用Makefile模板❤️❤️
1. 初代改进——.c到.o
我们说使用上述iso逐步推导的方式太麻烦了,直接从test.c到mytest也不方便,我们期望的是将所有的文件转换为.o,文件,在进行连接的时候,就是这些.o文件与库中的直接连接在一起,比较方便,因此,我们希望先将所有的.c文件变为.o文件。


2. 二代进阶版本——类似宏定义
# 二代代码
BIN = mytest
SRC = test.c
OBJ = test.o
CC = gcc
RM = rm -f$(BIN): $(OBJ)$(CC) $(OBJ) -o $(BIN)$(OBJ): $(SRC)$(CC) -c $(SRC) -o $(OBJ).PHONY: clean
clean:$(RM) $(BIN) $(OBJ)
-
变量定义
BIN = mytest SRC = test.c OBJ = test.o CC = gcc RM = rm -fBIN: 目标可执行文件的名称。SRC: 源文件名称。OBJ: 目标文件(编译后的中间文件)的名称。CC: 编译器(gcc)。RM: 用于删除文件的命令(rm -f)。
-
生成目标
$(BIN)$(BIN): $(OBJ)$(CC) $(OBJ) -o $(BIN)- 表示
$(BIN)依赖于$(OBJ)。 - 如果
$(BIN)不存在或者$(OBJ)的修改时间比$(BIN)更新,则执行编译命令gcc test.o -o mytest。
- 表示
-
生成目标
$(OBJ)$(OBJ): $(SRC)$(CC) -c $(SRC) -o $(OBJ)- 表示
$(OBJ)依赖于$(SRC)。 - 如果
$(OBJ)不存在或test.c有更新,则执行gcc -c test.c -o test.o来生成目标文件test.o。
- 表示
-
清理目标
clean.PHONY: clean clean:$(RM) $(BIN) $(OBJ).PHONY: clean指定clean为伪目标,不与文件同名。clean目标用于删除生成的二进制文件和目标文件。
3. ❤️❤️❤️! ! ! 最终版本——多文件通配 ! ! !❤️❤️❤️
首先我们需要创建100个.c文件来模拟:
使用 {} 来一次性创建 100 个 .c 文件,可通过 touch 和 {} 来批量创建文件:
touch file{1..100}.c

# 最终代码BIN = mytest # 定义目标可执行文件的名称为 mytest
# SRC = $(shell ls *.c) # 使用 shell 命令列出当前目录下的所有 .c 文件(已注释掉,改用 wildcard)
SRC = $(wildcard *.c) # 使用 wildcard 函数获取当前目录下所有的 .c 文件,赋值给 SRC 变量
OBJ = $(SRC:.c=.o) # 使用模式替换,将 SRC 中的每个 .c 文件名替换为对应的 .o 文件名,赋值给 OBJ 变量CC = gcc # 定义使用的编译器为 gcc
RM = rm -f # 定义删除文件的命令为 rm -f(强制删除)# 目标文件 $(BIN) 依赖于所有的目标文件 $(OBJ)
$(BIN): $(OBJ)@$(CC) $^ -o $@ # 编译命令,$^ 表示所有依赖文件(即 OBJ),$@ 表示目标文件(即 BIN)@echo "链接 $^ 成 $@" # 输出编译链接的命令信息,$^ 表示依赖文件,$@ 表示目标文件# %.o: %.c 是一个模式规则,表示对于每个 .c 文件生成对应的 .o 文件
%.o: %.c@$(CC) -c $< # 编译命令,$< 表示第一个依赖文件(即 .c 文件),$@ 表示目标文件(即 .o 文件)@echo "编译... $< 成 $@" # 输出编译过程的命令信息,$< 表示 .c 文件,$@ 表示 .o 文件.PHONY: clean # 声明 clean 为伪目标,避免与文件名冲突
clean: # clean 目标用于清理编译生成的文件$(RM) $(BIN) $(OBJ) # 使用 rm -f 命令删除可执行文件和目标文件
$(BIN): 表示目标文件(在这里是mytest)。$@在命令中代表当前目标文件名。$(OBJ): 表示目标文件的依赖(即.o文件)。$^在命令中表示所有的依赖文件。$^: 在命令中表示所有的依赖文件(即所有.o文件)。$@: 在命令中表示当前目标文件(例如mytest)。$<: 在命令中表示第一个依赖文件(例如.c文件)。.PHONY: clean: 声明clean为伪目标,意味着clean不是文件名,而是一个命令目标,防止与实际的clean文件冲突。@: 在命令前加@,表示不输出执行命令本身,仅输出命令的结果。$(wildcard *.c): 使用wildcard函数获取当前目录下所有.c文件名,并将其赋值给SRC变量。$(SRC:.c=.o): 使用模式替换,将SRC中所有.c文件名替换为对应的.o文件名,赋值给OBJ变量。$(shell ls *.c): 使用shell函数执行ls *.c命令来获取.c文件(虽然该行被注释掉,已用wildcard替代)。
4. 适度扩展的语法
BIN=proc.exe # 定义变量
CC=gcc
#SRC=$(shell ls *.c) # 采⽤shell命令⾏⽅式,获取当前所有.c⽂件名
SRC=$(wildcard *.c) # 或者使⽤ wildcard 函数,获取当前所有.c⽂件名
OBJ=$(SRC:.c=.o) # 将SRC的所有同名.c 替换 成为.o 形成⽬标⽂件列表
LFLAGS=-o # 链接选项
FLAGS=-c # 编译选项
RM=rm -f # 引⼊命令
$(BIN):$(OBJ)
@$(CC) $(LFLAGS) $@ $^ # $@:代表⽬标⽂件名。 $^: 代表依赖⽂件列表
@echo "linking ... $^ to $@"
%.o:%.c # %.c 展开当前⽬录下所有的.c。 %.o: 同时展开同
名.o
@$(CC) $(FLAGS) $< # %<: 对展开的依赖.c⽂件,⼀个⼀个的交给gcc。
@echo "compling ... $< to $@" # @:不回显命令
.PHONY:clean
clean:
$(RM) $(OBJ) $(BIN) # $(RM): 替换,⽤变量内容替换它
.PHONY:test
test:
@echo $(SRC)
@echo $(OBJ)
👍👍👍总结: Makefile 的好处👍👍👍
Makefile 的好处包括:
-
自动化构建:通过定义规则,Makefile 可以自动化编译、链接等过程,节省手动操作时间。
-
增量编译:Makefile 会根据文件的修改时间自动判断哪些文件需要重新编译,避免重复编译未修改的文件,提高效率。
-
简化管理复杂项目:对于有多个源文件的项目,Makefile 可以统一管理文件的依赖关系,避免手动处理每个文件,减少错误。
-
跨平台支持:Makefile 是跨平台的构建工具,支持在多种操作系统和环境中使用,如 Linux、macOS 和 Windows。
-
灵活性和可扩展性:可以根据项目的需要灵活地定义不同的构建规则,处理各种需求,如清理临时文件、执行测试等。
-
易于维护:集中管理构建命令和依赖关系,使得构建过程清晰明了,便于团队协作和后期维护。
-
支持并行构建:在支持的环境下,Makefile 可以并行执行多个任务,加速大规模项目的构建过程。
-
简化团队协作:通过共享 Makefile,团队成员可以确保一致的构建流程和规范,减少人为差错。
总的来说,Makefile 提供了一种高效、灵活、易于维护的自动化构建方式,尤其适用于大型和复杂的项目。
那么到这里,make与Make的内容就结束啦,欢迎大家交流讨论~~~😘😘😘
创作不易,J桑求各位大大一个一键三连,谢谢各位大佬 ! ! !

相关文章:
️代码的华尔兹:在 Makefile 的指尖上舞动自动化的诗篇
文章目录 😶🌫️😶🌫️😶🌫️背景——一个优秀工程师必备技能😶🌫️😶🌫️😶🌫️一、🤩🤩快速了解…...
函数式编程Stream流(通俗易懂!!!)
目录 1.Lambda表达式 1.1 基本用法 1.2 省略规则 2.Stream流 2.1 常规操作 2.1.1 创建流 2.1.2 中间操作 filter map distinct sorted limit 编辑skip flatMap 2.1.3 终结操作 foreach count max&min collect anyMatch allMatch noneMatch …...
数据分析:转录组差异fgsea富集分析
文章目录 介绍加载R包数据链接导入数据数据预处理DE testing: 2BP vs no-BP比较limma-voomLoad steroid dataIn No-BP patientsIn 2BP patientsCompare gene expression vs bacterial mass其他系统信息介绍 转录组差异fgsea富集分析是一种基于基因集的富集分析方法,它关注的是…...
在Django中安装、配置、使用CKEditor5,并将CKEditor5录入的文章展现出来,实现一个简单博客网站的功能
在Django中可以使用CKEditor4和CKEditor5两个版本,分别对应软件包django-ckeditor和django-ckeditor-5。原来使用的是CKEditor4,python manager.py makemigrations时总是提示CKEditor4有安全风险,建议升级到CKEditor5。故卸载了CKEditor4&…...
AI笔筒操作说明及应用场景
AI笔筒由来: 在快节奏的现代办公环境中,我们一直在寻找既能提升效率、增添便利,又能融入企业文化、展现个人品味的桌面伙伴。为此,我们特推出专为追求卓越、注重细节的您设计的AI笔筒礼品版,它集高科技与实用性于一身…...
Android自启动管控
1. 自启动管控需求来源 自启动、关联启动、交叉启动、推送启动等现象的泛滥除了对个人信息保护带来隐患外,还会导致占用过多的系统CPU和内存资源,造成系统卡顿、发热、电池消耗过快;还可能引入一些包含“恶意代码”的进程在后台隐蔽启动&…...
把握鸿蒙生态崛起的机遇:开发者视角的探讨
大家好,我是程序员小羊! 前言: 近年来,鸿蒙系统(HarmonyOS)的发展备受瞩目。随着其在智能手机、智能穿戴、车载系统和智能家居等领域的广泛应用,鸿蒙系统正逐渐形成与安卓、iOS并列的三足鼎立…...
MySQL初学之旅(1)配置与基础操作
目录 1.前言 2.正文 2.1数据库的发展历程 2.2数据库的基础操作 2.2.1启动服务 2.2.2创建与删除数据库 2.2.3数据类型 2.2.4创建表与删除表 2.3MySQL Workbench基础使用简介 3.小结 1.前言 哈喽大家好吖,今天博主正式开始为大家分享数据库的学习ÿ…...
一款革命性的视频剪辑工具,AI剪辑新纪元:Clapper
如果说AI视频剪辑工具哪家强?还真想不出有什么让人眼前一亮的AI视频剪辑应用。 毕竟随着AI技术的发展越来越快,各种AI应用如雨后春笋般涌现,然而,真正能够在视频剪辑领域脱颖而出的工具却寥寥无几。 今天我要介绍的 Clapper 就是…...
HTML 区块
HTML 区块 HTML(HyperText Markup Language)是构建网页的标准语言,它定义了网页的结构和内容。在HTML中,区块元素是指那些能够定义较大块状结构的元素,比如段落、标题、列表、表格和 divis 等。这些元素通常对页面的布…...
复杂度的讲解
数据结构可以简单理解为在内存中管理数据 它具有速度快 带电存储的特点(临时存储) 如何衡量一个算法的好坏 因此衡量一个算法的好坏,一般是从时间和空间两个维度来衡量的,即时间复杂度和空间复杂度。 时间复杂度主要衡量一个算…...
[ Linux 命令基础 2 ] Linux 命令详解-系统管理命令
🍬 博主介绍 👨🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 养成习…...
使用docker部署Prometheus和Grafana去监控mysql和redis
自动化性能监控系统安装部署 相关工具的安装部署 服务工具分配 服务器工具端口10.0.20.9grafana300010.0.20.9prometheus909010.0.20.10mysql330610.0.20.10mysql-exporter910410.0.20.10redis330610.0.20.10redis_exporter9121 使用docker-compose安装prometheus 先拉取p…...
日志管理 | Log360 实现PCI DSS v4.0数据安全合规要求
PCI DSS 是一项网络安全标准,得到所有主要信用卡和支付处理公司的支持,旨在确保信用卡和借记卡号码的安全。最新的PCI DSS v4.0 代表支付卡行业数据安全标准。 任何依赖信用卡交易的企业都不能将数字安全视为一个偷工减料的领域,因为数据泄露…...
JAVA中的string和stringbuffer
【之前面试测试岗位的时候有被问到这个问题,面试结束后特地来学习一下】 目录 谁先被提出的String的使用StringBuffer的使用两者区别 谁先被提出的 String类先于StringBuffer被提出,作为Java语言的基础部分,而StringBuffer是为了解决实际开…...
轻型民用无人驾驶航空器安全操控------理论考试多旋翼部分笔记
官网:民用无人驾驶航空器综合管理平台 (caac.gov.cn) 说明:一是法规部分;二是多旋翼部分 本笔记全部来源于轻型民用无人驾驶航空器安全操控视频讲解平台 目录 官网:民用无人驾驶航空器综合管理平台 (caac.gov.cn) 一、轻型民用无人…...
计算用户订购率梧桐数据库和oracle数据库sql分析
一、背景说明 移动运营商平台提供多种类型的产品权益,用户可以通过订购来使用。平台需要定期统计各个产品的用户订购情况,以便了解各个产品的受欢迎程度。这些统计数据将用于优化产品、提升用户体验和制定市场推广策略。 二、表结构说明 梧桐数据库建…...
通过DNS服务器架构解释DNS请求过程
在前面的章节,这里,基于PCAP数据包和RFC文档详细介绍了DNS请求和响应的每个字段的含义。但是在现实的网络世界中,DNS请求和响应的数据包是怎么流动的,会经过哪些设备。本文将着重说明一下目前网络空间中DNS请求和响应的流动过程。 当前网络空间中比较常见DNS请求的流程如下…...
OKG Research:用户意图驱动的Web3应用变革
出品| OKG Research 作者|Samuel QIN 当前加密市场的快速演变中,用户增长成为行业可持续发展的基石。目前主流观点在推动行业前进的路上,从单纯的技术探索在向更注重应用价值的方向转变。尽管近年来Web3生态系统发展迅速…...
hbase 工具类
hbase 工具类 pom.xml <dependency><groupId>org.apache.hbase</groupId><artifactId>hbase-client</artifactId><version>2.5.10-hadoop3</version> </dependency> <dependency><groupId>com.google.guava<…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
