06.VSCODE:备战大项目,CMake专项配置
娇小灵活的简捷配置不过是年轻人谈情说爱的玩具,帝国大厦的构建,终归要交给CMake去母仪天下。一个没有使用 CMake 的 C++ 项目,就像未来世界里的一台相声表演,有了德纲却无谦,观众笑着遗憾。—— 语出《双城记》作者,英国批判现实主义文学的开拓者查尔斯.狄更斯。
版权声明:
- 《双城记》是查尔斯.狄更斯写的
- 中文版是叶红译的
- 书(包括封面设计)是长江文艺出版社的
- 郭德纲肯定是郭德纲的爸妈生的
- 于谦按理说是于谦的爸妈生的
- C++是 Bjarne Stroustrup 无性繁殖的
- CMake是 Bill Hoffman无性繁殖的
- 这个破课程,是 南郁-第2学堂 剖腹产的
欢迎关注 本课程在CSDN的完整专栏。欢迎到 d2school.com 查看更多相关课程。
这节课,我们的任务是:
- 通过 msys2 安装 CMake
- 在 vscode 创建 CMake 专项配置
- CMake 扩展基本设置
- CMake 项目演示
- CMake 扩展高级配置(其实就是状态栏的几个入口)
零、课堂视频
同样,请先看不到9分钟的视频,过程中不必一边看一边跟着操作,完整流畅地看完整个演示视频,再跟着本课堂的文本内容操作,必要时采用复制粘贴,更高效,更不会出错。
VSCODE:备战大项目,CMake专项配置
一、安装 CMake
可以在 Windows 下,可以通过 CMake 官网下载合适的安装程序(注意 32/64 位之分),独立安装 CMake,但我们推荐在 msys2 环境内下载。 如果你两个都下载安装了,注意去除 Windows 环境中的路径(PATH)变量,并确保清楚自己在使用哪一个 CMake 可执行程序。
在 msys2 环境内安装 CMake 非常简单,进入对应的环境(本课程一直使用 UCRT,具体说明见课程第1节《MSYS2+GCC 安装与应用》),仍然是通过一行 pacman 指令安装:
pacman -S mingw-w64-ucrt-x86_64-cmake
如图:
简介:Ninja / 忍者
图中可见,CMake 包含的软件包不少,其中比较重要的是 Ninja 包(https://ninja-build.org/。它是 Google 公司推出且广为使用的,可显著提升软件项目构建速度的工具。不过 CMake 完全可以脱离 Ninja 使用,但是,我们的目标
是星辰大海是复杂、大型的C++项目构建 ,所以选择 NinJia 是必然的。并且,用它也无需多学什么,不用白不用。
如果你是在 msys2 外独立安装 CMake ,记得要检查是否有附上 Ninja。
完成安装后,可在 msys2-ucrt 环境下,通过下面这条指令(其实是四条命令结合在一起)查看 CMake 安装位置、CMake 的版本、Ninja 安装位置以及 Ninja 版本。
whereis cmake && cmake --version && whereis ninja && ninja --version
如图:
显示的可执行文件位置均相对于当初你安装 msys2 (通常是 msys64)根目录,所以你的任务是在 Windows 资源管理里找到 cmake.exe 和 ninja.exe。
当前我装的是 CMake 3.30.5,Ninja 1.12.1,到你安装时应该是更是高版本了。
二、创建 CMake 专用配置
2.1 创建 CM-CPP-CMake 配置
打开 VSCODE,通过主菜单或左侧边栏底部的小齿轮按钮,进入 “配置文件” 管理页面,如图:
现有的 CS-CPP-Simple 是前面C/C++简捷项目专用配置课堂中,我们为 C++ 小项目创建的专用配置(Profile)——为什么我们要特意提到它?因为,这节课我们新配置的创建,必须基于简捷配置(划重点)。
- ① 点击页面中大大的 “新建配置文件” 按钮;
- ② 输入名字 “CM-CPP-CMake”;
- ③ 接着,在 “复制自” 一栏的下拉列表中,选中 “CS-CPP-Simple”——关键步骤;
- ④ 点右下 “创建” 按钮。
全部过程如下图:
其中关键的第3步,是为了在新建的配置中,继续复用之前我们在 CS-CPP-Simple(C++简捷项目专用配置)中的 C/C++ 扩展和它的设置。
小心宫斗戏!
当然,后面我们需要对部分设置做修改,从而 “弱化” C/C++ 扩展的 影响,避免这两位在后宫当着皇帝面宫斗不休,烦得很(皇帝当然就是用户,也就是我们)。
完成创建后,立即在左侧配置列表中,仔细找 “CM-CPP-CMake” ,并将它设置成活动配置(之所以强调 “仔细找”,是因为此处的配置列表项,是按名称排序的,新建的配置很有可能会突然变成第二项)。
2.2 选择专用颜色主题
完成切换后,我眼前一黑,于是我按下 Ctrl+K, T(这个热键还记得吧?逗号是不用输入的哦),纠结了两个小时后,我决定就使用 “深色主题+”(Default Dark+),它的特征也是深色,但状态栏是彩的。
顺便,检查一下图中箭头指示的位置,C/C++扩展已经在我们的新配置中,这是一眼可见的。不可见的是,像取消 UNICODE 特殊符号警告、以及 C/C++ 代码智能提示所使用的语言标准(我们用的都是17)等等设置,我们都不用重复再做一遍了。
三、调整 C/C++ 相关设置
3.1 问题:朕有新欢了……
朕有新欢其实不成问题,问题根源在于:1.有新欢后,旧欢的出现就是错;2.偏偏,新欢要正常工作还离不开旧欢?
VSCODE自带通用调试、C/C++ 扩展、以及下一步我们要安装的 CMake 扩展,都提供了一和编译、运行、调试相关的界面组件,典型的如我们在 CS-CPP-Simple 配置下经常要用到的,位于活动文件右上角的:添加调试配置、运行或调试当前活动文件(或工作区内所有源文件)等操作入口:
不仅右上角,左下角也有。在C/C++的默认设置下,当我们第一次启动调试,状态栏右端位置,还会出现一个用于选择调试任务的入口,如图:
这项入口的来源倒不是 C/C++ 扩展,而是 VSCODE 自带的调试功能。
有了 CMake 扩展,图中标示的操作入口不是没用,而是有错(基本上就是你一误点就出错),可是它们不会主动躲开,而是天天在我们眼前晃,严重影响我们和新欢,哦不,是和新扩展的感情,所以我们要去除它,从而为新欢留出床位。
3.2 方法:仅在表面上废弃旧欢……
(一)确保在新建的 CM-CPP-CMake 配置下,如果有打开工作区或文件夹,建议先关闭,然后打开设置页(热键:Ctrl + ,),确保位于 “用户”级别下;
(二)在设置项过滤栏输入 “Cpp Debug Shortcut”,将得到 “C_Cpp: Debug Shortcut” 设置项,去除其下 “Show ‘Run and Debug’ play button and ‘Add Deubg Configuration’ gear ……” 的选中状态,如图:
(三)过滤栏输入 “Debug Show in Status Bar”,然后在和过滤内容同名的设置内,从下拉框中选择 “never” (操作时适合的内心戏:无情帝王冲废后咆啸:“NEVER!” )
很可惜,以上操作只是在界面上将 C/C++ 扩展的相关操作入口隐藏,更容易搞混热键入口并没有关闭。
四、安装 CMake 扩展
可以开始迎娶新娘娘了……
确保处于 CM-CPP-CMake 配置下……然后在扩展市场找到 出于微软的 “CMake Tools”(这个扩展包包含 CMake 的扩展),安装它。
五、设置 CMake 扩展
5.1 基础步骤
(一)确保在新建的 CM-CPP-CMake 配置下,如果有打开工作区或文件夹,建议先关闭,然后打开设置页(热键:Ctrl + ,),确保位于 “用户”级别下;
(二)可以先在左边树形设置目录中,找到 “扩展 / CMake Tools”,整体看看CMake 扩展的众多设置项。
5.2 设置 CMake 可执行路径
我们历来不建议在 Windows 环境变量中添加全局路径,因此,装完 CMake 扩展之后,首先要告诉 VSCODE 上哪里去找 CMake.exe 。
(一)设置过滤栏内输入:CMake Path,找到过滤内容同名的设置项内,填写 cmake 可执行程序的完整路径,在本课程中是 “c:\msys64\ucrt64\bin\cmake.exe”,注意,因为是在图形界面填写,所以此处路径分隔符无需转义:
(我就曾不小心把 ucrt64 写成 urct64……)
(二)另外,我们还需为 CMake 指定上哪里找编译器。过滤栏输入 “Cmake Additional Compiler Search Dirs”,点“添加项”后,输入“c:\msys64\ucrt64\bin”,最后“确定”,如图:
未来你可能需要使用CMake在同一个项目中,支持多种编译器(比如在 Linux下使用gcc,在Mac下使用 clang),到时记得在这里添加更多编译器的位置。
5.3 让 CMake 使用 Ninja
CMake 是母后,它能生成多种制作文件和多家IDE(比如 Visual Studio 、Code::Blocks)的项目文件,现在我们要让它固定生成 Ninja 所需的制作文件。输入 “CMake Generator”过滤,然后在同名设置项内,输入:Ninja
(注意首字母大写):
5.4 设置 CMake 调试选项
最后,我们一样需要为 gdb.exe 添加启动指令,一样希望在外部独立的控制台调试程序,不过,这次不是在 launch.json 中设置,CMake Tools 扩展内置任务与启动设置(当然,如有需要,也可以和 launch.json / tasks.json 继续配合)。在我看来,使用 CMake Tools 带来的最大的好处之一是,可以实现一次性配置,而不是每个项目都需要手工改 launch.json/tasks.json。
重点当然是:确保在新建的 CM-CPP-CMake 配置下,用户级别上,做如下设置。
(一)设置过滤栏内输入 “CMake Debug Config”,找到同名设置项,点击 “在 settings.json 中编辑 ”:
将自动打开 CM-CPP-CMake 配置下用户级别的 settings.json 文件,请于其内找到 “cmake.debugConfig” 字段(它是一个JSON对象),一开始,它的一对花括号内应该是空的,请将它修改成:
"cmake.debugConfig": { "externalConsole": true,"setupCommands": [{"description": "为 gdb 启用整齐打印","text": "-enable-pretty-printing","ignoreFailures": true},{"description": "将反汇编风格设置为 Intel","text": "-gdb-set disassembly-flavor intel","ignoreFailures": true},{"description": "让 GDB 使用 UTF-8 编码","text": "-gdb-set charset UTF-8","ignoreFailures": false} ]}
如果前面的课堂你没有打瞌睡,此处无需解释,每一项你都应该很熟悉了,倒是建议看看该文件中,别的以 “cmake.” 开头的字段,并尝试尽量将它们和前面的设置对应起来。
Ctrl + S 保存上述设置文件,然后关闭它。如果设置页还开着,也关闭。
六、测试使用 CMake
6.1 准备源文件
在操作系统里新建个目录,取名 “HelloCMake”,然后用 VSCode 打开它,再将配置切换成 “CM-CPP-CMake”。
于其内新建 main.cpp 文件,UTF-8编码,内容为:
#include <cstdlib>
#include <iostream>
#include <string>int main()
{std::system("chcp 65001 > nul");std::string hello = "CMake —— 母仪天下,帝国管家!";std::cout << hello << std::endl;std::system("pause");
}
6.2 快速开始:生成 CMakeList.txt
在 VSCode 内按下热键 Ctrl+Shift+P,然后输入 “CMake Quick Start”,
不知道哪位高人,把此处的 “Quick Start” 翻译成 “快速入门”,极具误导性。
这里的 “Quick Start” 就是 “快速开始”之意,它将一步步引导我们生成 CMake 项目最为重要的文件 “CMakeList.txt” (没有之一)。
(一)输入项目名称,我们取 “hello_cmake” ,通常它就是构建得到的程序名字:
(二)选择语言,请选 C++:
(三)选构建目标类型,我们选可执行程序:
(四)选择其他选项,默认可选的有打包安装组件和测试组件,现在,我们一个都不要,直接回车:
(五)加入已有源文件,勾上 main.cpp:
(六)添加新预设,我们暂不添加,并且后面的步骤都暂不需要,因此,此步需直接按 Esc 键中止向导(如果你不小心手按快了,也没关系,还是按 Esc 键中止即可):
一顿操作猛如虎,最终生成的 CMakeLists.txt 为:
cmake_minimum_required(VERSION 3.5.0)
project(hello_cmake VERSION 0.1.0 LANGUAGES C CXX)add_executable(hello_cmake main.cpp)
三行,第一行指定本项目对 cmake 版本号的最低要求;第二行指定本项目名称、版本、以及所有语言为 C 和 C++ (记住,在CMake中,基本都是 CXX 表示C++,而不是CPP);最后一行指定本项目将生成一个可执行(executable)程序,名字也叫 hello_cmake,并且只用到一个源文件,main.cpp。
就这样?不是,以上操作还生成了一个子目录,叫 “build”,和 CMakeLists.txt 同级,如图:
这个目录的名字也可以在设置中修改,它的作用是用来存储构建过程中生成的最终文件,以及大量的中间文件。你可以随感时删除它,反正一构建它就会重新生成。
请特别注意两点:
- build 目录下有个名为 build.ninja 的文件,表明 CMake 确实没生错“孩子”;
- 在 vscode 左侧边栏悄悄冒出一个按钮,下面称它为 CMake 边栏。
6.3 快速了解 CMake 项目状态
关键词:项目状态、构建Kits、构建变体、构建目标……
进入 CMake 边栏,注意到 “配置” 节点下有个 “unspec”子节点,这会令优秀的程序员夜不能寐……请点击它左端的小笔,在弹出列表中,选择 “GCC 14.2.0 x86_64-w64-mingw32(urct64)…”:
选择后,CMake将对该编译套件进行一番检测,通过后,该节点将变成:
它的意思是:您现在正在构建的,是使用 “GCC 14.2.0 x86_64-w64-mingw32(urct64)”编译组件(在CMake中称为 “Kits”),且构建 “变体” 是 “Debug” (即:具备调试信息)的程序。
之所以 Kits 一开始是 “unspec”,是因为我们现在只用一套编译组件,所以在一开始时就直接跳过去相关选择,通常不会带来什么问题,CMake会做必要的自动推导。
我们也可以切换构建变体,只需尝试点击 Debug 节点右端的小笔,这回将弹出 CMake 预置的变体列表:
因为我们下一步就是要调试程序,所以请保持使用 Debug 变体。
明确构建类型后,接着需要关心构建目标。这回请看上图中的 “生成” 节点,它的子节点是 “all”,表示将生成该项目的所有目标,我们现在也只有一个构建目标,所以,可以让目标更明确一些:
其他几个节点都可以先不管,最终我们得到如下项目状态:
6.4 构建(生成) F7
在 CMake 侧边栏内,选择 “生成” 子节点,然后点击其右端的生成按钮:
如果你的代码没有错误,且 CMake 相关设置也无误,则应在 vscode 底部的输出终端,看到 “生成已完成,退出代码为0” 的输出。同时,在项目的 build 文件夹内,应能看到:hello_cmake.exe 。
在 CMake 环境,构建项目的热键是:F7。
6.5 调试 Shift+F5
切换到 main.cpp ,在第9行加断点:
切换到 CMake 侧边栏,选中“调试”节点,然后点击其右端的调试按钮:
目标程序将被启动,且被调试器停止在第7行,vscode 自动打开左侧调试边栏,显示 hello 变量内容,包含汉字,无乱码。点击调试栏的“逐过程”,控制台上出现输出内容:
在 CMake 环境下,启动项目调试的热键是: Shift + F5。
注意,F5 仍然是 C/C++ 扩展用于启动调试当前活动文件的热键,但在 CMake 环境下,这个热键引发的操作:编译当前活动文件 → 生成可执行文件 → 启动调试,都不是我们想要的。
6.6 全速运行
切换到 CMake 侧边栏,选中“启动”节点,然后点击其右端的运行按钮:
点击 CMake 侧边栏 “启动” 节点右端的小三角按钮,将在 vscode 集成的终端中直接运行程序——暂时没有简单的办法让它使用外部终端,并且,它也一样没能解决输入汉字再回显时的乱码问题。
手工写 tasks.json 和 launch.json 可以做到对调试和运行的更多控制,但对于一个 CMake 项目,改回纯手工管理会带来更多其它麻烦。再加上我们使用 CMake 管理的实际项目,多数不会有需要从控制台读入汉字输入的需求,真有这个需要,工作中可以写一个tasks.json,或者干脆在外部开一个控制台就能解决,所以,“无法在外部控制台直接启动程序” 这个问题也就无所谓了……
七、状态栏上CMake操作
C/C++ 妃被打入冷宫,CMake 娘娘成功上位后,状态栏左侧见风使舵地多出三个小按钮,分别是 CMake 项目里的 “生成”、 “调试” 和 “启动”,如图:
可在用户级设置中,通过 “CMake Status Bar Visibility”,过滤,找到如下设置项,并将值改变成 “visible”:
这时,状态栏会一下子多出很多 CMake 操作入口,并且带有详细标题:
当前,CPack、工作流我们用得比较少,可以通过以下方法,来隐藏它们——不仅在状态栏上,也在 CMake 侧边栏上。
在设置页中,使用 “cmake.options.advanced” 过滤,然后点击该项设置的 “在 settings.json 中编辑 ”,如图:
先确保 “cmake.options.statusBarVisibility” 字段值为 “visible”,它会让所有入口都默认可见(所以,其实改成 “hidden” ,反倒可以少一些设置项,大家可以自行试试):
再对 “cmake.options.advanced” 做修改,二者最终内容如下:
"cmake.options.statusBarVisibility": "visible","cmake.options.advanced": { "variant": {"statusBarVisibility": "compact", // 变体使用精简方式},"kit": {"statusBarVisibility": "compact", // 构建组件使用精简方式},"configure": { // 配置,只能在侧边栏中显示"projectStatusVisibility": "visible"},"build": { // 生成"statusBarVisibility": "visible",},"buildTarget": { // 生成目标选择"statusBarVisibility": "visible",},"debug": { // 调试"statusBarVisibility": "inherit",},"launch": { // 启动"statusBarVisibility": "visible",},"cpack": { // 打包"statusBarVisibility": "hidden","projectStatusVisibility": "hidden"},"workflow": { // 工作流"statusBarVisibility": "hidden","projectStatusVisibility": "hidden"}},
得到的状态栏是:
得到的CMake侧边栏(项目状态树)是:
显然,当漂亮的鼓励师(其实就是搞卫生的阿姨)站在你身后时,你应该尽量使用最高效也最帅气的操作:热键!!!
通常我会没事就来几下 Ctrl + K,T,按键时,配合身体前俯后仰以及几根刘海的剧烈抖动……从屏幕的反光中能清楚地看到鼓励师看向我的眼神,仿佛是吉娜看向郞朗……对面的老刘就学不来了这招,因为他已头秃。
如果鼓励师不在,或者你的脑容量记不了几个热键,那就使用状态上的入口吧。毕竟,每个人的天份是不一样的。有些人可以同时记住七个女生的姓名、生日、喜欢的礼物、爱好,随时无缝切换;而有些程序狗,比如我,只配同时记住 Borland C++ Builder、Visual Studio、Code::Blocks、CLion、QCreator、VSCode 的热键,随时无缝切换。
相关文章:

06.VSCODE:备战大项目,CMake专项配置
娇小灵活的简捷配置不过是年轻人谈情说爱的玩具,帝国大厦的构建,终归要交给CMake去母仪天下。一个没有使用 CMake 的 C 项目,就像未来世界里的一台相声表演,有了德纲却无谦,观众笑着遗憾。—— 语出《双城记》作者&…...

还是小时候味道的麻辣片
麻辣片的诞生,源于人们对辣味的热爱和对丰富口感的追求。它将辣椒的火辣、香料的浓郁和豆制品的醇厚完美结合在一起,创造出了一种令人回味无穷的美食体验。无论是在学校的小卖部、街头的小吃摊,还是超市的货架上,麻辣片都以其鲜艳…...
GaussDB部署架构
GaussDB部署架构 云数据库GaussDB管理平台(TPOPS)基于B/S架构开发,由Web、管控Service、管控Agent三部分组成,软件结构如图1所示。 图1 各节点部署架构 Web:作为用户接入子系统,用于将用户在Web下发的操作…...

遥测数据采集工具Grafana Alloy
介绍 Alloy是Grafana产品公司旗下的一款新主推遥测数据采集工具,Grafana Alloy也是一个开源OpenTelemetry收集器,具有内置 Prometheus管道并支持指标、日志、跟踪和配置文件。Alloy支持为OTEL、Prometheus、Pyroscope、Loki等服务提供许多指标、日志、跟…...

线性数据结构
数组 数组(Array) 是一种很常见的数据结构。它由相同类型的元素(element)组成,并且是使用一块连续的内存来存储。 我们直接可以利用元素的索引(index)可以计算出该元素对应的存储地址。 数组…...

【ArcGIS微课1000例】0127:计算城市之间的距离
本文讲述,在ArcGIS中,计算城市(以地级城市为例)之间的距离,效果如下图所示: 一、数据准备 加载配套实验数据包中的地级市和行政区划矢量数据(订阅专栏后,从私信查收数据),如下图所示: 二、计算距离 1. 计算邻近表 ArcGIS提供了计算点和另外点之间距离的工具:分析…...
【算法】二分
1. 找到有序区间中 x 最左边的数字的位置 static int getL(int a[], int l, int r, int x) {while (l < r) {int mid l r >> 1;if (x < a[mid]) {r mid;} else {l mid 1;}}if (a[l] ! x) return -1;return l;} 2. 找到有序区间中 x 最右边的数字的位置 stati…...
ARM CCA机密计算安全模型之简介
安全之安全(security)博客目录导读 目录 1、引言 2、问题陈述 3、CCA 安全保证 3.1 对领域所有者的安全保证 3.2 对host环境的安全保证 Arm 机密计算架构(CCA)安全模型(SM)定义了 CCA 隔离架构的安全要求和基本安全属性。这…...

蓝桥杯-洛谷刷题-day3(C++)
目录 1.忽略回车的字符串输入 i.getline() ii.逐个字符的识别再输入 2.获取绝对值abs() 3.做题时的误区 4.多个变量的某一个到达判断条件 i.max() 5.[NOIP2016 提高组] 玩具谜题 i.代码 6.逻辑上的圆圈 i.有限个数n的数组 7.数组的定义 i.动态数组 1.忽略回车的字符串输…...
K8S资源限制之ResourceQuota
ResourceQuota介绍 在K8S中,大部分资源都可以指定到一个名称空间下,因此可以对一个名称空间的计算资源,存储资源,资源数量等维度做资源限制。 如限制pod数量、svc数量,控制器数量,限制PVC请求的存储量 注…...

释放高级功能:Nexusflows Athene-V2-Agent在工具使用和代理用例方面超越 GPT-4o
在不断发展的人工智能领域,Nexusflows 推出了 Athene-V2-Agent 作为其模型系列的强大补充。这种专门的代理模型设计用于在功能调用和代理应用中发挥出色作用,突破了人工智能所能达到的极限。 竞争优势 Athene-V2-Agent 不仅仅是另一种人工智能模型&…...

MongoDB索引操作和执行计划Explain()详解
一、索引操作 说明,下面的内容举例时,以"dailyTrip"collection为例。 字段内容如下: {"_id" : ObjectId("63ec5a971ddbe429cbeeffe3"), // object id"car_type" : "Gett", // string&…...

H3C NX30Pro刷机教程-2024-11-16
H3C NX30Pro刷机教程-2024-11-16 ref: http://www.ttcoder.cn/index.php/2024/11/03/h3c-nx30pro亲测无需分区备份 路由器-新机初始化设置路由器登录密码telnet进入路由器后台 刷机上传uboot到路由器后台在Windows环境下解压后的软件包中打开 tftpd64.exe在NX30Pro环境下通过以…...

无插件H5播放器EasyPlayer.js网页web无插件播放器vue和react详细介绍
EasyPlayer.js H5播放器,是一款能够同时支持HTTP、HTTP-FLV、HLS(m3u8)、WS、WEBRTC、FMP4视频直播与视频点播等多种协议,支持H.264、H.265、AAC、G711A、Mp3等多种音视频编码格式,支持MSE、WASM、WebCodec等多种解码方…...

HarmonyOS ArkUI(基于ArkTS) 开发布局 (中)
HarmonyOS ArkUI(基于ArkTS) 开发布局 (上) 四 层叠布局 (Stack) 层叠布局(StackLayout)用于在屏幕上预留一块区域来显示组件中的元素,提供元素可以重叠的布局。层叠布局通过Stack容器组件实现位置的固定定位与层叠&…...
org.springframework.context.support.ApplicationListenerDetector 详细介绍
一,功能介绍 early post-processor for detecting inner beans as ApplicationListeners 早期的PostProcessor用来检测并处理内部(inner)bean作为 ApplicationListeners BeanPostProcessor that detects beans which implement the Applica…...

MSTP实验
单点故障---冗余---环路---STP----RSTP-----MSTP MSTP 产生的背景 因为RSTP在局域网内所有VLAN 共享一棵生成树,如果链路被堵塞,将无法承载任何流量,所以为了实现流量负载均衡,MSTP诞生了。 生成树不是基于VLAN运行的ÿ…...
Linux---shell脚本
文章目录 目录 文章目录 前言 一.Shell脚本定义 shell脚本书写规范 shell脚本执行方式 二.Shell变量 变量定义 定义规范 定义方式 变量的运算 数值运算 数值比较 未完待续...... 前言 希望通过本文的学习,你能够掌握Shell脚本的基本知识和实用技巧,…...

Android12的ANR解析
0. 参考: ANR分析 深入理解 Android ANR 触发原理以及信息收集过程 1.ANR的触发分类: ANR分为4类: InputDispatchTimeout:输入事件分发超时5s,包括按键和触摸事件。BroadcastTimeout:比如前台广播在10s内未执行完成࿰…...
初学人工智不理解的名词3
TTS领域的名词 from gpt-4o 在 TTS(文本到语音合成) 领域,以下是 CFM、One-Step 蒸馏 和 ReFlow 的含义和作用的详细解释: 1. CFM(Consistent Flow Matching) Consistent Flow Matching(一致流…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...

代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...

Vue ③-生命周期 || 脚手架
生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期: 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...