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

‍️代码的华尔兹:在 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 的重要性

  1. Makefile 的掌握与工程能力
    是否会编写 Makefile,从某种程度上反映了一个人是否具备完成大型工程项目的能力。它不仅是一个编译文件,更是一种有效的项目管理工具。

  2. 工程中的文件管理与编译规则
    在工程项目中,源文件通常按类型、功能或模块组织在不同的目录中。Makefile 定义了一系列规则,指定文件的编译顺序与依赖关系,包括:

    • 哪些文件需要优先编译
    • 哪些文件需要重新编译
    • 更复杂的功能操作
  3. 自动化编译的优势
    Makefile 的最大优势在于实现“自动化编译”。一旦编写完成,仅需一个 make 命令,即可完成整个项目的自动编译,大大提高了开发效率。

  4. 工具支持
    Make 是一种解释 Makefile 指令的命令工具,广泛应用于各种 IDE,例如:

    • Delphi 的 make
    • Visual C++ 的 nmake
    • Linux 下的 GNU make

    因此,Makefile 已成为工程项目中的主流编译方法。

  5. Make 与 Makefile 的配合
    Make 是一条命令,而 Makefile 是一个配置文件。两者相互配合,可实现项目的自动化构建与高效管理。

在这里插入图片描述


一、🤩🤩快速了解make与Makefile核心思想🤩🤩

1. 快速见一面

问:make与Makefile是什么呢?
答:make是一个命令,Makefile是一个指令。
在这里插入图片描述


2. 具体语法——Makefile

Makefile 语法基础

  1. 依赖关系与依赖方法
    Makefile 的核心语法就是“依赖关系 + 依赖方法”。这两者决定了文件编译的顺序和方式。

    • 依赖关系:某个文件(称为“目标”)需要其他文件(称为“依赖”)准备好才能编译。例如,main.o: main.c utils.h 表示 main.o 依赖于 main.cutils.h。换句话说,在生成 main.o 之前,main.cutils.h 必须是最新的。
    • 依赖方法:告诉 Makefile 如何生成目标文件的具体指令。例如,gcc -c main.c -o main.o 指明如何生成 main.o 文件。Makefile 会执行这些方法来自动编译项目。
  2. .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 命令的输出中,我们可以看到文件的三个主要时间属性:

  1. Access Time(atime) - 访问时改变时间
    表示文件最后一次被读取的时间。任何对文件内容的读取(如打开文件查看)都会更新这个时间,但文件的属性和内容不会因此改变。A时间不是每一次访问都被修改,这样有效降低了IO,一般可能访问10次会做一次修改。

  2. Modify Time(mtime) - 修改内容改变时间
    表示文件内容最后一次被修改的时间。如果文件的内容发生变化(例如文件被编辑或写入新数据),mtime 就会更新。一般来说M时间变化了,代表文件被修改,而一般文件被修改,它的大小等等可能会变,因此C时间会跟着变化。

  3. Change Time(ctime) - 修改属性改变时间
    表示文件元数据最后一次被更改的时间。例如,修改文件的权限、所有者或文件名都会更新 ctime。注意,ctime 反映的是文件状态的变化,而不是文件内容的直接修改。


2. make对比时间

当你运行 make 时,Make 会检查源文件和生成的可执行文件的时间戳。工作流程如下:

  1. 初次执行
    在源文件和可执行文件都存在的情况下,Make 会对比它们的时间戳。如果源文件比可执行文件更新,说明源代码被修改过,Make 将重新编译生成可执行文件。

  2. 重复执行
    此时源文件如果没有被修改过,bin的时间比较新,他就不会去执行make(即没有更新),再次执行 make 时不会重新编译,节省了重复编译的时间。如果源文件被修改过了,源文件的时间就会更新,比bin的时间更新,因此就可以执行。

  3. 执行 make clean
    使用 make clean 时,定义的清理规则会删除生成的文件(如可执行文件、目标文件等),清理掉这些文件的时间戳记录。

  4. 重新生成可执行文件
    由于 make clean 删除了之前生成的可执行文件,再次执行 make 时,系统找不到这些文件,于是会重新编译并生成可执行文件。


通过这种时间戳的比对机制,make 实现了智能编译,即只在必要时重新编译文件,从而加快开发流程。

在这里插入图片描述


3. 回到.PHONY

make比较的是原文件与可执行程序的M时间,
因此,PHONY修饰的目标原理是忽略了时间的比较,它的方法总是被执行。

以下是优化后的内容,进一步阐明了 make 的时间戳比对机制和 .PHONY 的作用及好处:


4. Make 的智能编译机制的好处

  1. 避免不必要的编译,提升效率
    make 通过源文件和可执行文件的时间戳对比,判断哪些文件需要重新编译。这种机制确保只有在源文件发生更改时才会触发编译,从而节省时间、降低 CPU 和 I/O 资源消耗。

  2. 减少错误和不一致
    这种机制也降低了手动编译可能产生的版本不一致或遗漏文件更新的风险。编译流程变得更可靠,确保了最新的源代码得到正确的编译。


三、😴😴makefile会自行推导😴😴

1. 现象分析——自行推导

Makefile 能够自行推导多个依赖目标的生成步骤,使得我们可以从一份源文件自动构建出最终的可执行文件。例如,以下代码展示了从 test.c 文件逐步生成可执行文件 mytest 的过程:

我们有这样的依赖关系:
在这里插入图片描述

依赖关系会自动推导如下:
在这里插入图片描述

最终可以执行:
在这里插入图片描述


2. 原理解释

这种逐步生成的编译流程可以理解为依赖栈的原理make 会依次推导每个目标文件的依赖关系,将最底层的依赖按顺序编译生成最终的目标文件 mytest。过程如下:

  1. 查找依赖:当执行 make mytest 时,make 会检查 mytest 的依赖项(即 test.o)是否存在且最新。
  2. 向下递归:如果 test.o 不存在或不是最新,make 会检查 test.o 的依赖 test.s 是否存在且最新。
  3. 逐层构建:依次向下直到最底层的 test.c,按顺序执行编译命令:
    • test.c 生成 test.i(预处理)
    • test.i 生成 test.s(汇编代码生成)
    • test.s 生成 test.o(汇编)
    • test.o 最终生成 mytest(链接)
      在这里插入图片描述
      通过 make 的自动推导机制,我们可以通过依赖栈的形式按需生成目标文件,而无需手动编写每一步的命令。

以下是对内容的优化:


3. Make 的默认工作流程

当只输入 make 命令时,make 将按照默认方式执行以下步骤:

  1. 查找 Makefile 文件
    make 会在当前目录中寻找名为 Makefilemakefile 的文件。

  2. 定位第一个目标文件
    找到 Makefile 文件后,make 会将其中定义的第一个目标(target)文件作为最终的构建目标。例如,上例中,make 会将 myproc 作为最终生成的文件。

  3. 检查目标文件及依赖项时间
    如果 myproc 文件不存在,或者它依赖的文件(例如 myproc.o)有较新的修改时间,make 将执行 Makefile 中定义的命令来生成 myproc

  4. 递归生成依赖项
    如果 myproc 的依赖文件 myproc.o 不存在,make 会继续查找 myproc.o 的生成规则。这会递归地查找依赖,直到找到一个存在的文件或底层源文件,例如 .c 文件。

  5. 编译生成目标
    make 找到底层源文件(如 .c 文件)时,便会执行对应的命令来生成依赖文件,如 myproc.o,再继续编译生成最终目标 myproc

  6. 逐层查找依赖关系
    make 逐层检查和生成每一层的依赖,直到最终生成第一个目标文件。这种递归查找和编译依赖的过程类似于一个栈结构。

  7. 错误处理
    在查找或生成的过程中,如果某个关键文件缺失,make 会退出并报错。如果是执行命令时出现错误,例如编译失败,make 将跳过该命令继续查找其他依赖关系。

  8. 依赖关系管理
    make 只管理文件的依赖关系。如果在解析依赖关系时无法找到某个依赖文件,make 将终止工作,不会执行进一步的命令。

这种依赖机制让 make 仅在必要时重新编译文件,从而简化了构建流程,避免了重复编译,提高了效率。


四、❤️❤️必看!!!❤️❤️逐层深入构建万能通用Makefile模板❤️❤️

1. 初代改进——.c到.o

我们说使用上述iso逐步推导的方式太麻烦了,直接从test.cmytest也不方便,我们期望的是将所有的文件转换为.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)
  1. 变量定义

    BIN = mytest
    SRC = test.c
    OBJ = test.o
    CC = gcc
    RM = rm -f
    
    • BIN: 目标可执行文件的名称。
    • SRC: 源文件名称。
    • OBJ: 目标文件(编译后的中间文件)的名称。
    • CC: 编译器(gcc)。
    • RM: 用于删除文件的命令(rm -f)。
  2. 生成目标 $(BIN)

    $(BIN): $(OBJ)$(CC) $(OBJ) -o $(BIN)
    
    • 表示 $(BIN) 依赖于 $(OBJ)
    • 如果 $(BIN) 不存在或者 $(OBJ) 的修改时间比 $(BIN) 更新,则执行编译命令 gcc test.o -o mytest
  3. 生成目标 $(OBJ)

    $(OBJ): $(SRC)$(CC) -c $(SRC) -o $(OBJ)
    
    • 表示 $(OBJ) 依赖于 $(SRC)
    • 如果 $(OBJ) 不存在或 test.c 有更新,则执行 gcc -c test.c -o test.o 来生成目标文件 test.o
  4. 清理目标 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 的好处包括:

  1. 自动化构建:通过定义规则,Makefile 可以自动化编译、链接等过程,节省手动操作时间。

  2. 增量编译:Makefile 会根据文件的修改时间自动判断哪些文件需要重新编译,避免重复编译未修改的文件,提高效率。

  3. 简化管理复杂项目:对于有多个源文件的项目,Makefile 可以统一管理文件的依赖关系,避免手动处理每个文件,减少错误。

  4. 跨平台支持:Makefile 是跨平台的构建工具,支持在多种操作系统和环境中使用,如 Linux、macOS 和 Windows。

  5. 灵活性和可扩展性:可以根据项目的需要灵活地定义不同的构建规则,处理各种需求,如清理临时文件、执行测试等。

  6. 易于维护:集中管理构建命令和依赖关系,使得构建过程清晰明了,便于团队协作和后期维护。

  7. 支持并行构建:在支持的环境下,Makefile 可以并行执行多个任务,加速大规模项目的构建过程。

  8. 简化团队协作:通过共享 Makefile,团队成员可以确保一致的构建流程和规范,减少人为差错。

总的来说,Makefile 提供了一种高效、灵活、易于维护的自动化构建方式,尤其适用于大型和复杂的项目。


那么到这里,make与Make的内容就结束啦,欢迎大家交流讨论~~~😘😘😘

创作不易,J桑求各位大大一个一键三连,谢谢各位大佬 ! ! !

在这里插入图片描述

相关文章:

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

文章目录 &#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️背景——一个优秀工程师必备技能&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️&#x1f636;‍&#x1f32b;️一、&#x1f929;&#x1f929;快速了解…...

函数式编程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两个版本&#xff0c;分别对应软件包django-ckeditor和django-ckeditor-5。原来使用的是CKEditor4&#xff0c;python manager.py makemigrations时总是提示CKEditor4有安全风险&#xff0c;建议升级到CKEditor5。故卸载了CKEditor4&…...

AI笔筒操作说明及应用场景

AI笔筒由来&#xff1a; 在快节奏的现代办公环境中&#xff0c;我们一直在寻找既能提升效率、增添便利&#xff0c;又能融入企业文化、展现个人品味的桌面伙伴。为此&#xff0c;我们特推出专为追求卓越、注重细节的您设计的AI笔筒礼品版&#xff0c;它集高科技与实用性于一身…...

Android自启动管控

1. 自启动管控需求来源 自启动、关联启动、交叉启动、推送启动等现象的泛滥除了对个人信息保护带来隐患外&#xff0c;还会导致占用过多的系统CPU和内存资源&#xff0c;造成系统卡顿、发热、电池消耗过快&#xff1b;还可能引入一些包含“恶意代码”的进程在后台隐蔽启动&…...

把握鸿蒙生态崛起的机遇:开发者视角的探讨

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言&#xff1a; 近年来&#xff0c;鸿蒙系统&#xff08;HarmonyOS&#xff09;的发展备受瞩目。随着其在智能手机、智能穿戴、车载系统和智能家居等领域的广泛应用&#xff0c;鸿蒙系统正逐渐形成与安卓、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.前言 哈喽大家好吖&#xff0c;今天博主正式开始为大家分享数据库的学习&#xff…...

一款革命性的视频剪辑工具,AI剪辑新纪元:Clapper

如果说AI视频剪辑工具哪家强&#xff1f;还真想不出有什么让人眼前一亮的AI视频剪辑应用。 毕竟随着AI技术的发展越来越快&#xff0c;各种AI应用如雨后春笋般涌现&#xff0c;然而&#xff0c;真正能够在视频剪辑领域脱颖而出的工具却寥寥无几。 今天我要介绍的 Clapper 就是…...

HTML 区块

HTML 区块 HTML&#xff08;HyperText Markup Language&#xff09;是构建网页的标准语言&#xff0c;它定义了网页的结构和内容。在HTML中&#xff0c;区块元素是指那些能够定义较大块状结构的元素&#xff0c;比如段落、标题、列表、表格和 divis 等。这些元素通常对页面的布…...

复杂度的讲解

数据结构可以简单理解为在内存中管理数据 它具有速度快 带电存储的特点&#xff08;临时存储&#xff09; 如何衡量一个算法的好坏 因此衡量一个算法的好坏&#xff0c;一般是从时间和空间两个维度来衡量的&#xff0c;即时间复杂度和空间复杂度。 时间复杂度主要衡量一个算…...

[ Linux 命令基础 2 ] Linux 命令详解-系统管理命令

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…...

使用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 是一项网络安全标准&#xff0c;得到所有主要信用卡和支付处理公司的支持&#xff0c;旨在确保信用卡和借记卡号码的安全。最新的PCI DSS v4.0 代表支付卡行业数据安全标准。 任何依赖信用卡交易的企业都不能将数字安全视为一个偷工减料的领域&#xff0c;因为数据泄露…...

JAVA中的string和stringbuffer

【之前面试测试岗位的时候有被问到这个问题&#xff0c;面试结束后特地来学习一下】 目录 谁先被提出的String的使用StringBuffer的使用两者区别 谁先被提出的 String类先于StringBuffer被提出&#xff0c;作为Java语言的基础部分&#xff0c;而StringBuffer是为了解决实际开…...

轻型民用无人驾驶航空器安全操控------理论考试多旋翼部分笔记

官网&#xff1a;民用无人驾驶航空器综合管理平台 (caac.gov.cn) 说明&#xff1a;一是法规部分&#xff1b;二是多旋翼部分 本笔记全部来源于轻型民用无人驾驶航空器安全操控视频讲解平台 目录 官网&#xff1a;民用无人驾驶航空器综合管理平台 (caac.gov.cn) 一、轻型民用无人…...

计算用户订购率梧桐数据库和oracle数据库sql分析

一、背景说明 移动运营商平台提供多种类型的产品权益&#xff0c;用户可以通过订购来使用。平台需要定期统计各个产品的用户订购情况&#xff0c;以便了解各个产品的受欢迎程度。这些统计数据将用于优化产品、提升用户体验和制定市场推广策略。 二、表结构说明 梧桐数据库建…...

通过DNS服务器架构解释DNS请求过程

在前面的章节,这里,基于PCAP数据包和RFC文档详细介绍了DNS请求和响应的每个字段的含义。但是在现实的网络世界中,DNS请求和响应的数据包是怎么流动的,会经过哪些设备。本文将着重说明一下目前网络空间中DNS请求和响应的流动过程。 当前网络空间中比较常见DNS请求的流程如下…...

OKG Research:用户意图驱动的Web3应用变革

出品&#xff5c; OKG Research 作者&#xff5c;Samuel QIN 当前加密市场的快速演变中&#xff0c;用户增长成为行业可持续发展的基石。目前主流观点在推动行业前进的路上&#xff0c;从单纯的技术探索在向更注重应用价值的方向转变。尽管近年来Web3生态系统发展迅速&#xf…...

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<…...

会议直击|美格智能受邀出席第三届无锡智能网联汽车生态大会,共筑汽车产业新质生产力

11月10日&#xff0c;2024世界物联网博览会分论坛——第三届无锡智能网联汽车生态大会在无锡举行&#xff0c;美格智能CEO杜国彬受邀出席&#xff0c;并参与“中央域控&#xff1a;重塑汽车智能架构的未来”主题圆桌论坛讨论&#xff0c;与行业伙伴共同探讨智能网联汽车产业领域…...

在 Jupyter Notebook 中使用 Matplotlib 进行交互式可视化的教程

在 Jupyter Notebook 中使用 Matplotlib 进行交互式可视化的教程 引言 数据可视化是数据分析的重要组成部分&#xff0c;能够帮助我们更直观地理解数据。Matplotlib 是 Python 中最流行的绘图库之一&#xff0c;而 Jupyter Notebook 则是进行数据分析和可视化的理想环境。本文…...

Android13 系统/用户证书安装相关分析总结(三) 增加安装系统证书的接口遇到的问题和坑

一、前言 接上回说到&#xff0c;修改了程序&#xff0c;增加了接口&#xff0c;却不知道有没有什么问题&#xff0c;于是心怀忐忑等了几天。果然过了几天&#xff0c;应用那边的小伙伴报过来了问题。用户证书安装没有问题&#xff0c;系统证书(新增的接口)还是出现了问题。调…...

【C++ 算法进阶】算法提升十三

目录标题 抽牌概率问题 &#xff08;动态规划&#xff09;动态规划题目分析代码 洗衣机问题 &#xff08;贪心&#xff09;题目题目分析 抽牌概率问题 &#xff08;动态规划&#xff09; 动态规划 假设现在有1~N N张牌 每张牌的序号就代表着他的大小 &#xff08;1 2 … N&am…...

【计网不挂科】计算机网络期末考试(综合)——【选择题&填空题&判断题&简述题】完整试卷

前言 大家好吖&#xff0c;欢迎来到 YY 滴计算机网络 系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 本博客主要内容&#xff0c;收纳了一部门基本的计算机网络题目&#xff0c;供yy应对期中考试复习。大家可以参考 本章是去答案版本。带答案的版本在下…...

2024年11月中旬记录

11.11 pigz的使用 压缩文件夹命令&#xff1a; tar -cvf - dir_name | pigz > xxx.tar.gz 解压分两步&#xff0c;pigz解压和tar解压&#xff1a; pigz -d xxx.tar.gz tar -xf xxx.tar...

单体架构 IM 系统之长轮询方案设计

在上一篇技术短文&#xff08;单体架构 IM 系统之核心业务功能实现&#xff09;中&#xff0c;我们讨论了 “信箱模型” 在单体架构 IM 系统中的应用&#xff0c;“信箱模型” 见下图。 客户端 A 将 “信件” 投入到客户端 B 的 “信箱” 中&#xff0c;然后客户端 B 去自己的 …...

Android Studio加载旧的安卓工程项目报错处理

文章目录 Invalid Gradle JDK configuration foundNDK not configuredCMake 3.10.2 was not found安装cmake适配cmake版本号 com.intellij.openapi.externalSystem.model.ExternalSystemExceptiongradle版本过低或下载不了下载gradle与依赖库超时替换gradle国内源替换Maven 仓库…...

阿里公告:停止 EasyExcel 更新与维护

最近&#xff0c;阿里发布公告通知&#xff0c;将停止对知名 Java Excel 工具库 EasyExcel 的更新和维护。EasyExcel 由阿里巴巴开源&#xff0c;作者是玉箫&#xff0c;在 GitHub 上拥有 30k stars、7.5k forks 的高人气。 据悉&#xff0c;EasyExcel 作者玉箫去年已从阿里离…...

Spring 中的 BeanWrapper

BeanWrapper 是 Spring 框架中的一个接口&#xff0c;它提供了一种方式来设置和获取 JavaBean 的属性。JavaBean 是一种特殊的 Java 类&#xff0c;遵循特定的编码约定&#xff08;例如&#xff0c;私有属性和公共的 getter/setter 方法&#xff09;&#xff0c;通常用于封装数…...

梧州网站建设定制/交友网站有哪些

翻过高山走不出你ob是output buffering的简称&#xff0c;就是输出缓冲区。如果使用了ob_start函数&#xff0c;那么之后的输出内容(echo等)就不进行实际输出&#xff0c;而是存入缓冲区里面&#xff0c;随后可以使用ob_flush实际输出、ob_clean删除、ob_get_contents获得内容保…...

宁波网站建设的步骤过程/seo也成搜索引擎优化

sql server 性能调优之 资源等待PAGELATCH 原文:sql server 性能调优之 资源等待PAGELATCH一.概述 在前几章介绍过 sql server 性能调优资源等待之PAGEIOLATCH&#xff0c;PAGEIOLATCH是出现在sql server要和磁盘作交互的时候&#xff0c;所以加个IO两个字。这次来介绍PAGELATC…...

东莞网站关键排名/女教师遭网课入侵视频大全集

1&#xff1a;Esri在开源领域做过哪些工作&#xff1f; Esri一直以来就是开源技术的用户和支持者。我们相信&#xff0c;通过提供从上到下的开放平台可使我们的用户成为开发能力强大的解决方案的积极参与者。在现有技术形势下&#xff0c;我们正在将我们的想法集成到开源项目中…...

如何网站做淘客/抖音代运营

原文链接http://www.cnblogs.com/zhouzhendong/p/8671759.html 题目传送门 - BZOJ3944 题意 多组数据&#xff08;组数<10)。 每组数据一个正整数$n(n\leq 10^{10})$。 让你求$\sum_{i1}^{n}\varphi(i)$以及$\sum_{i1}^{n}\mu(i)$。 题解 杜教筛模版题。 杜教筛学习->传送…...

怎么去找做网站的/怎么建网站免费的

Vue第三篇 复习 """ v-if | v-show "tag 0"v-if | v-else-if | v-elsev-for"obj in objs"<div :abc"obj">{{ obj }}</div>computed&#xff1a;监听绑定函数中的所有变量&#xff0c;返回值给绑定的变量 watch&…...

HTTPS网站做CDN加速/首页关键词优化公司

转自&#xff1a;http://dgd2010.blog.51cto.com/1539422/1726693 Zabbix Proxy简介 Zabbix Proxy是实现Zabbix分布式监控的重要组成部分&#xff0c;是连接Zabbix Agent和Zabbix Server的“中间人”、“连接器”、“路由器”等。Zabbix Proxy将来自Agent的数据推送&#xff08…...