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

Linux内核配置与构建原理

Kconfig文件

Kconfig是Linux内核中用于配置功能的脚本语言系统,由众多内核源码树中每个目录下的Kconfig文件组成。它定义Linux相关的配置选项层次结构和依赖关系。

menuconfig工具,会抓取Kconfig中的信息,为用户输出友好的交互式菜单选项配置界面。用户在此界面选择需要编译的模块(如Y/N/M),配置结果会保存在.config文件中。

驱动开发:添加新驱动时需在对应目录创建Kconfig条目,并修改上级目录的Kconfig和Makefile以包含新配置。

menuconfig 工具

menuconfig 是 Linux 内核配置的核心工具之一,是基于Kconfig生成的交互式配置工具,提供用户友好的配置菜单界面,简化了内核编译和模块选择的过程。以下是其关键信息:

  1. 基本定义与功能

    Menuconfig 是 make menuconfig 的缩写,基于 ncurses 库实现文本菜单界面。

    用户可通过层级菜单选择或取消内核功能、驱动、文件系统等配置项,无需直接编辑复杂的 .config 文件。

    相较于命令行交互式配置(如 make config)需要逐项回答提问,Menuconfig 提供了更直观的导航和批量操作能力,降低了配置难度。

  2. 核心用途

    内核功能定制:启用/禁用特定功能(如网络协议、硬件驱动、调试工具)。

    模块管理:选择将功能编译为内置模块(Y)、动态加载模块(M)或完全排除(N),优化内核体积。

    硬件适配:为不同硬件平台(如 ARM、X86)配置对应的驱动和优化选项。

    参数调整:设置内核运行参数(如网络栈缓存大小、文件系统行为)。

总结来说,Menuconfig 通过交互式菜单和智能导航设计,将复杂的内核配置转化为可视化的操作流程,是 Linux 系统开发和优化的必备工具。

.config文件

.config文件是配置结果的存储文件,位于内核根目录的.config是用户配置的最终产物,以键值对形式记录所有选项的状态。

.config文件中的配置项被用来: 指导编译系统(make)决定哪些代码需要编译进内核、作为模块或排除。 若不存在,make会使用默认配置(如arch/arm/configs/xxx_defconfig)生成初始文件。

注意事项:直接修改.config可能导致依赖冲突,推荐通过menuconfig调整配置。

Makefile文件

make命令

make命令是编译系统的入口,根据.config和Makefile执行构建操作。make过程会、或者可以做到:

  • 解析.config中的配置项,结合各目录的Makefile决定编译哪些文件。

  • 通过条件编译语句(如obj-$(CONFIG_XXX) += file.o)控制代码的编译方式(内核内置、模块或忽略)。

  • 支持多种编译目标(如make zImage生成内核镜像,make modules编译模块)。

Makefile文件

Makefile 是 自动化构建脚本,定义了软件项目的编译规则、依赖关系和执行顺序。通过 make 命令调用,它能够自动完成代码编译、链接、安装等任务,是 Linux 和嵌入式开发的核心构建工具。

Makefile 的核心作用

  1. 自动化编译 根据源文件(.c.h)的修改时间自动重新编译依赖的文件,避免重复劳动。

  2. 跨平台与交叉编译支持 通过定义变量(如 CCCFLAGS)适配不同编译器(GCC、ARM GCC)和架构(x86、ARM)。

  3. 依赖管理 明确文件间的依赖关系(如 main.o 依赖 main.cutils.h),确保正确编译顺序。

  4. 简化复杂构建流程 将多步骤构建(如清理、安装、生成配置文件)封装为简单命令(如 make cleanmake install)。

  5. 集成其他工具 调用 ldobjcopystrip 等工具生成可执行文件、库文件或烧录镜像。

四者的协作流程

配置阶段:用户通过make menuconfig启动界面,基于Kconfig文件生成菜单树,调整后保存到.config。

编译阶段:make读取.config,根据Makefile中的规则和条件语句编译对应代码。 依赖闭环:Kconfig中的依赖关系确保.config的合法性,而make通过Makefile将配置转化为编译行为

比喻的描述其关系:

Kconfig:定义配置逻辑的“设计图”。-厨师提供的菜品单。 menuconfig:用户交互的“操作界面”。-点餐员。 .config:存储用户选择的“配置文件”。-点餐员根据客人选择的菜品记录下来的点餐单。 Makefile:定义了软件项目的编译规则、依赖关系和执行顺序。-当次做菜的方法和过程。(1.做哪些菜品?读取.config里的配置项,动态调整编译规则。2.每个菜品应该如何烹饪的食材、方法和先后顺序) make:执行编译的“构建引擎”。-给厨师下命令做菜,并输出客户点的菜品。

其他细节


细节1:内核 Makefile 如何动态调整编译规则(基于 .config

一、核心机制:kbuild 系统与配置融合

1. 配置转换为宏定义

当执行 make defconfigmake menuconfig 生成 .config 后,内核会通过脚本(如 scripts/kconfig/confdefconfig)自动生成 autoconf.h 文件。该文件将 .config 中的配置项转换为 C 语言宏定义:

#define CONFIG_GPIO_SUPPORT 1  // 如果配置为 y
#define CONFIG_GPIO_INTERRUPTS m // 如果配置为 m
  • y:表示功能被编译到内核镜像中(直接链接)。

  • m:表示功能被编译为可加载模块(.ko 文件)。

  • n:功能被禁用,不参与编译。

2. Makefile 中的条件编译

内核的 Makefile(尤其是顶层 Makefile 和各子目录的 Makefile)通过以下方式动态调整编译规则:

  • 基于配置启用/禁用源文件

    # 如果 CONFIG_GPIO_SUPPORT 为 y,则将 gpio.o 编译到内核中
    obj-y += gpio.o
    # 如果 CONFIG_GPIO_INTERRUPTS 为 m,则将 gpio_interrupts.o 编译为模块
    obj-m += gpio_interrupts.o

  • 通过 $(CONFIG_XXX) 变量引用配置状态

    ifeq ($(CONFIG_GPIO_SUPPORT), y)CFLAGS += -DENABLE_GPIO
    endif
二、内核 Makefile 的动态规则生成
1. obj-$(CONFIG_XXX) 语法

内核 Makefile 使用 obj-$(CONFIG_XXX) 的语法动态控制目标文件的编译方式:

  • obj-y:将文件编译到内核镜像中(当 CONFIG_XXX=y 时生效)。

  • obj-m:将文件编译为模块(当 CONFIG_XXX=m 时生效)。

  • obj-n:明确禁止编译(即使配置为 y 也不编译)。

示例drivers/gpio/Makefile):

obj-y += gpio_core.o   # 总是被编译到内核中,当CONFIG_XXX=y时。
obj-m += gpio_module.o # 仅在 CONFIG_GPIO_SUPPORT=m 时编译为模块
obj-n += deprecated.o  # 显示地禁用旧代码
2. 依赖关系的传递

如果某个配置项依赖于其他配置(如 CONFIG_USB_CORE=yCONFIG_USB_HUB=y 的前提),内核的 Kconfig 会通过 depends on 规则强制关联。对应的 Makefile 会自动忽略无效配置(例如未启用 USB 核心的情况下无法编译 USB HUB)。

三、.config 如何影响编译流程
  1. 生成 autoconf.h

    内核构建时会执行以下步骤:

    make -C /path/to/kernel M=$PWD

    其中,scripts/kconfig/ 目录下的脚本会扫描 .config 并生成 autoconf.h,该文件会被包含到内核源码中(通过 #include <linux/autoconf.h>),从而在 C 代码中可用。

  2. 动态链接对象文件

    • 对于 obj-y 的文件:Makefile 会将这些目标文件直接链接到内核映像(vmlinux)。

    • 对于 obj-m 的文件:Makefile 会将这些文件打包为模块(.ko),并在 modules_install 阶段安装到 /lib/modules/$(KERNEL_VERSION)/kernel/ 目录下。

  3. 条件编译与裁剪

    • 如果 CONFIG_GPIO_SUPPORT=n,内核会跳过所有依赖 GPIO 的代码和模块。

    • 通过 $(CONFIG_XXX) 宏定义,C 代码可以直接判断功能是否启用:

      #ifdef CONFIG_GPIO_SUPPORT// 启用 GPIO 功能的代码
      #endif
四、交互场景示例:启用 GPIO 中断支持
1. 配置阶段
make menuconfig   # 打开配置界面
# 导航到 Device Drivers → GPIO Support → 启用 GPIO_INTERRUPTS=m

此时,.config 中新增:

CONFIG_GPIO_SUPPORT=y
CONFIG_GPIO_INTERRUPTS=m
2. 生成配置头文件

运行 makemake prepare,内核会自动生成 autoconf.h,其中包含:

#define CONFIG_GPIO_SUPPORT 1
#define CONFIG_GPIO_INTERRUPTS 1  // 因为 m 被视为 "enabled for module"
3. 动态调整 Makefile
  • drivers/gpio/Makefile 中:

    obj-m += gpio_interrupts.o  # 因为 CONFIG_GPIO_INTERRUPTS=m 有效
  • 如果 CONFIG_GPIO_SUPPORT=n,则 obj-m += gpio_interrupts.o 会被忽略。

4. 编译结果
  • 内核镜像:包含 gpio_core.o(因为 obj-y)。

  • 模块文件:生成 gpio_interrupts.ko(因为 obj-m)。

五、关键实现细节
  1. kbuild 的核心语法 内核 Makefile 使用特殊的 ​kbuild​ 语法,例如:

    ccflags-y:为目标文件添加编译器选项。

    ccflags-y += -I$(PWD)/include

    ldflags-y:为目标文件添加链接器选项。

    ldflags-y += -T $(PWD)/ linker_script.ld
  2. 配置冲突处理 如果 .config 中存在矛盾配置(例如同时设置 CONFIG_USB=yCONFIG_USB=n),内核的 make 命令会报错并终止构建。

  3. 交叉编译适配 在交叉编译环境中,.config 中需显式指定架构和交叉工具链:

    make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- defconfig
六、总结

内核的 Makefile 通过与 .config 的深度集成,实现了以下功能:

  1. 按需编译:仅启用必要的功能和硬件支持,减少代码量和内存占用。

  2. 模块化支持:通过 obj-m 动态管理可加载模块的编译。

  3. 跨平台兼容:结合交叉编译工具链和架构特定的配置规则。

理解这一机制对嵌入式开发者至关重要,它直接关系到内核定制的灵活性和最终二进制包的优化效果。

细节2:内核构建脚本的核心解析

内核的动态编译规则调整依赖于一系列脚本和工具链的协作,以下是与 .config 配置和 Makefile 生成密切相关的关键脚本及其作用:


一、配置管理与转换脚本
1. confdefconfig
  • 作用:生成默认配置文件(.config)或合并新旧配置。

  • 来源scripts/kconfig/confdefconfig

  • 关键逻辑:

    • defconfigarch/xxx/defconfig 生成初始配置。

    • 通过 olddefconfig 工具将当前 .config 与新内核默认配置对比,保留用户自定义选项。

    • 处理配置冲突(如 yn 同时存在时报错)。

2. kconfig 解析工具
  • 作用:解析 Kconfig 文件并生成配置依赖关系图。

  • 来源scripts/kconfig/parser.c(内核内置的 C 程序)。

  • 输出:

    • 生成 .config 的依赖关系(用于 make menuconfig 的自动折叠菜单)。

    • 生成 symbol_definessymbol_values(辅助配置头文件生成)。


二、配置头文件生成脚本
1. genconfig
  • 作用:将 .config 转换为 autoconf.hversion.h

  • 来源scripts/kconfig/genconfig

  • 关键逻辑:

    • 遍历 .config 中的每个配置项,生成对应的宏定义(如 #define CONFIG_GPIO_SUPPORT 1)。

    • 处理三态配置(m 会生成 CONFIG_GPIO_INTERRUPTS=1,但表示模块化)。

2. check-headers
  • 作用:验证生成的 autoconf.h 是否与内核源码兼容。

  • 来源scripts/kconfig/check-headers

  • 关键逻辑:

    • 检查头文件中是否存在重复定义或冲突的宏。

    • 确保所有依赖项已正确启用(如缺少 CONFIG_USB_CORE 时报错)。


三、Makefile 生成与动态规则处理
1. kbuild 核心脚本
  • 作用:处理 Makefile 的通用规则和依赖关系。

  • 来源scripts/kbuild/Makefile

  • 关键逻辑:

    • 自动包含子目录的 Makefile(通过 include $(SUBDIRS))。

    • 处理 obj-y/obj-m/obj-n 规则,生成编译目标列表。

    • 根据 $(CC)$(CFLAGS) 自动设置编译器和参数。

2. modules.mk
  • 作用:管理内核模块的编译和安装规则。

  • 来源scripts/kbuild/modules.mk

  • 关键逻辑:

    • 定义模块安装路径(/lib/modules/$(KERNEL_VERSION)/kernel/)。

    • 生成模块依赖文件(.modinfo)和符号表(.symvers)。

3. .dependauto-deps
  • 作用:自动生成源文件的依赖关系(类似 GCC 的 -MMD)。

  • 来源scripts/kbuild/dependscripts/kbuild/auto-deps

  • 关键逻辑:

    • 通过 makedepend 工具扫描源文件中的头文件引用。

    • 生成 .d 文件(如 main.o.d),并在 Makefile 中通过 -include $(DEPS) 引入。


四、交叉编译支持脚本
1. cross-compile-check.sh
  • 作用:验证交叉编译环境是否合法。

  • 来源scripts/cross-compile-check.sh

  • 关键逻辑:

    • 检查是否存在 $(CC)$(LD) 变量。

    • 确保交叉工具链支持目标架构(如 armaarch64)。

2. fixup-cross-compile
  • 作用:修复交叉编译时的路径和符号问题。

  • 来源scripts/fixup-cross-compile

  • 关键逻辑:

    • 修改编译器路径以匹配交叉工具链(如 arm-linux-gnueabi-gcc)。

    • 设置 sysroot 和头文件搜索路径(如 --sysroot=/path/to/arm-toolchain)。


五、配置冲突检测与修复
1. check-configuration
  • 作用:检测 .config 中的逻辑矛盾。

  • 来源scripts/kconfig/check-configuration

  • 关键逻辑:

    • 验证 depends onselect 关系的合法性。

    • 检查三态配置是否与布尔配置冲突(如 tristate 配置不能为 n 如果存在依赖项)。

2. silentoldconfig
  • 作用:静默合并新旧配置差异。

  • 来源scripts/kconfig/silentoldconfig

  • 关键逻辑:

    • 将新内核的默认配置与用户旧配置逐项对比。

    • 仅提示用户修改冲突项,其余项自动继承默认值。


六、实战调试脚本
1. make dconfig
  • 作用:基于 .config 生成交互式配置界面。

  • 来源scripts/kconfig/dconfig

  • 关键逻辑:

    • 读取 autoconf.hKconfig 生成动态菜单。

    • 支持在线搜索和配置回滚。

2. make traceconfig
  • 作用:跟踪配置项的依赖关系。

  • 来源scripts/kconfig/traceconfig

  • 关键逻辑:

    • 生成配置项的依赖树(如 CONFIG_GPIO_SUPPORT → CONFIG_ARM)。

    • 输出所有被激活的配置项及其路径。


七、总结:脚本协作流程
  1. 配置阶段

    • 用户通过 make menuconfig 修改 Kconfig,生成 .config

    • confdefconfigsilentoldconfig 处理配置冲突和默认值合并。

  2. 预处理阶段

    • genconfig 生成 autoconf.h,将配置转换为宏定义。

    • kbuild 脚本解析 obj-$(CONFIG_XXX) 规则,生成动态编译目标。

  3. 构建阶段

    • depend 自动生成源文件依赖关系。

    • modules.mk 处理模块编译和安装。

    • 交叉编译脚本(如 cross-compile-check.sh)确保工具链合法。

  4. 验证阶段

    • check-configurationcheck-headers 检测配置合法性。

    • make dconfigmake traceconfig 提供调试支持。


关键脚本与内核构建的关联图

make menuconfig → Kconfig 解析 → .config 生成  ↓  
make defconfig → confdefconfig → 默认配置合并  ↓  
make prepare → genconfig → autoconf.h 生成  ↓  
make all → kbuild/Makefile → obj-$(CONFIG_XXX) 规则应用  ↓  
make modules → modules.mk → 模块编译与安装  ↓  
make clean → depend 清理 .d 文件  

通过以上脚本的协作,内核能够实现 配置驱动开发(Configuration-Driven Development),极大简化了嵌入式设备的定制化过程。

相关文章:

Linux内核配置与构建原理

Kconfig文件 Kconfig是Linux内核中用于配置功能的脚本语言系统&#xff0c;由众多内核源码树中每个目录下的Kconfig文件组成。它定义Linux相关的配置选项层次结构和依赖关系。 menuconfig工具&#xff0c;会抓取Kconfig中的信息&#xff0c;为用户输出友好的交互式菜单选项配…...

大语言模型微调的基本概念介绍

大型语言模型&#xff08;LLMs&#xff09;正在以惊人的速度发展&#xff0c;LLM微调的潜力更是如此。大型语言模型的生命周期有几个关键步骤&#xff0c;今天我们将要介绍这个周期中最丰富、最耗时的一部分——LLM微调过程。 大语言模型的生命周期 在深入了解大型语言模型&a…...

实例分割 | yolov11训练自己的数据集

前言 因工作要求使用的都是yolov5系列的模型&#xff0c;今天学习一下最先进的yolov11&#xff0c;记录一下环境配置及训练过程。 1.项目下载及环境安装 源码位置&#xff1a;yolov11 可以看到&#xff0c;这里要求python版本大于等于3.8&#xff0c;我这里安装python3.10.…...

vue3:四嵌套路由的实现

一、前言 1、嵌套路由的含义 嵌套路由的核心思想是&#xff1a;在某个路由的组件内部&#xff0c;可以定义子路由&#xff0c;这些子路由会渲染在父路由组件的特定位置&#xff08;通常是 <router-view> 标签所在的位置&#xff09;。通过嵌套路由&#xff0c;你可以实…...

AIGC和搜索引擎的异同

AIGC&#xff08;生成式人工智能&#xff09;与搜索引擎的核心差异体现在信息处理方式和输出形态上&#xff0c;我们可以从以下维度对比&#xff1a; 一、工作原理的本质差异 信息检索机制 搜索引擎&#xff1a;基于关键词匹配&#xff08;如"中暑怎么办"→返回相关…...

ES批量查询

在 Elasticsearch 中&#xff0c;multi_search&#xff08;也称为 msearch&#xff09;是一种允许你在单个请求中执行多个搜索操作的 API。它可以显著减少网络开销&#xff0c;尤其是在需要执行多个查询时。multi_search 会将多个查询打包成一个请求发送给 Elasticsearch&#…...

Vue2学习

一、Vue3 基础 监视属性 天气案例 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>天气案例</…...

PySide(PyQT)重新定义contextMenuEvent()实现鼠标右键弹出菜单

在 PySide中&#xff0c;contextMenuEvent() 是 QWidget 类&#xff08;以及继承自它的所有子类&#xff09;的一个事件处理方法&#xff0c;主要用于处理上下文菜单事件&#xff0c;也就是当用户在控件上右键点击时触发的事件。 • 通过重新定义contextMenuEvent()来实现自定…...

Storm实时流式计算系统(全解)——下

storm编程案例-网站访问来源实时统计-需求 storm编程-网站访问来源实时统计-代码实现 根据以上条件可以只写一个类&#xff0c;我们只需要写2个方法和一个main&#xff08;&#xff09;&#xff0c;一个读取/发射&#xff08;spout&#xff09;。 一个拿到数据统计后发到redis…...

配置Nginx日志url encode问题

文章目录 配置Nginx日志url encode问题方法1-lua方法2-set-misc-nginx-module 配置Nginx日志url encode问题 问题描述&#xff1a; 当自定义日志输出格式&#xff0c;需要输出http请求中url参数时&#xff0c;如果参数中包含中文&#xff0c;是会进行url encode的&#xff0c…...

JAVA SE 包装类和泛型

文章目录 &#x1f4d5;1. 包装类✏️1.1 基本数据类型和对应的包装类✏️1.2 装箱和拆箱✏️1.3 自动装箱和自动拆箱 &#x1f4d5;2. 泛型✏️2.1 泛型的语法✏️2.2 泛型类的使用✏️2.3 裸类型(Raw Type)✏️2.4 擦除机制✏️2.5 泛型的上界✏️2.6 泛型方法✏️2.7 通配符…...

基于Linux系统的物联网智能终端

背景 产品研发和项目研发有什么区别&#xff1f;一个令人发指的问题&#xff0c;刚开始工作时项目开发居多&#xff0c;认为项目开发和产品开发区别不大&#xff0c;待后来随着自身能力的提升&#xff0c;逐步感到要开发一个好产品还是比较难的&#xff0c;我认为项目开发的目的…...

从零开始开发纯血鸿蒙应用之语音朗读

从零开始开发纯血鸿蒙应用 〇、前言一、API 选型1、基本情况2、认识TextToSpeechEngine 二、功能集成实践1、改造右上角菜单2、实现语音播报功能2.1、语音引擎的获取和关闭2.2、设置待播报文本2.3、speak 目标文本2.4、设置语音回调 三、总结 〇、前言 中华汉字洋洋洒洒何其多…...

物联网小范围高精度GPS使用

在园区内实现小范围高精度GPS&#xff08;全球定位系统&#xff09;定位&#xff0c;通常需要结合多种技术来弥补传统GPS在精度和覆盖范围上的不足。以下是实现小范围高精度GPS定位的解决方案&#xff0c;包括技术选择、系统设计和应用场景。 一、技术选择 在园区内实现高精度…...

一次有趣的前后端跨越排查

进行前后端代码联调的时候&#xff0c;使用axios调用后端请求&#xff0c;因为都是本地进行联调&#xff0c;所以没有考虑跨域的问题&#xff0c;写了一个get的请求接口&#xff0c;请求后端时&#xff0c;突然跳出下面的问题&#xff1a; 错误的信息一看很像就是跨域的问题&…...

大语言模型(LLM)如何赋能时间序列分析?

引言 近年来&#xff0c;大语言模型&#xff08;LLM&#xff09;在文本生成、推理和跨模态任务中展现了惊人能力。与此同时&#xff0c;时间序列分析作为工业、金融、物联网等领域的核心技术&#xff0c;长期依赖传统统计模型&#xff08;如ARIMA&#xff09;或深度学习模型&a…...

Kubernetes (K8S) 核心原理深度剖析:从架构设计到运行机制

Kubernetes(K8S)作为容器编排领域的“操作系统”,其设计和实现原理是开发者进阶的必修课。本文将从架构设计、核心组件协作、关键机制实现三个维度,结合源码逻辑与实战场景,分享 K8S 的底层运行原理。 一、Kubernetes 架构设计 1. 声明式 API 与控制器模式 K8S 的核心设…...

Excel 豆知识 - XLOOKUP 为啥会出 #N/A 错误

XLOOKUP有的时候会出 #VALUE! 这个错误。 因为这个XLOOUP有个参数叫 找不到时的返回值&#xff0c;那么为啥还会返回 #VALUE! 呢&#xff1f; 可能还有别的原因&#xff0c;但是主要原因应该就是 检索范围 和 返回范围 不同。 比如这里检索范围在 B列&#xff0c;是 4-21&…...

【深度学习】Hopfield网络:模拟联想记忆

Hopfield网络是一种经典的循环神经网络&#xff0c;由物理学家John Hopfield在1982年提出。它的核心功能是模拟联想记忆&#xff0c;类似于人类大脑通过部分信息回忆完整记忆的能力。以下是通俗易懂的解释&#xff1a; 1. 核心思想 想象你看到一张模糊的老照片&#xff0c;虽然…...

Python可视化大框架的研究与应用

## 摘要 随着数据科学和人工智能的快速发展&#xff0c;数据可视化成为了数据分析中不可或缺的一部分。Python作为一种功能强大且易于学习的编程语言&#xff0c;提供了多种可视化工具和库。本文旨在探讨Python可视化的主要框架&#xff0c;分析其特点、应用场景以及未来发展趋…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下&#xff1a; 一、场景操作步骤 操作步…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中&#xff0c;理解API&#xff08;应用程序接口&#xff09;和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能&#xff0c;使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

GitFlow 工作模式(详解)

今天再学项目的过程中遇到使用gitflow模式管理代码&#xff0c;因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存&#xff0c;无论是github还是gittee&#xff0c;都是一种基于git去保存代码的形式&#xff0c;这样保存代码…...