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

clangd与clang-tidy

Clangd是基于Clang的Language Server,主要用于提供代码补全、跳转定义、错误提示等IDE功能。而Clang-Tidy则是静态代码分析工具,用于检查代码中的潜在问题,比如风格违规、潜在bug等。


clangd 核心工作原理

1. 基于编译器的精准解析
  • 底层引擎:clangd 基于 LLVM/Clang 前端,像编译器一样解析代码,构建精确的 AST(抽象语法树)

  • 关键优势:能正确处理嵌入式开发中的硬件相关宏定义特殊语法扩展

    // 示例:解析STM32的寄存器位定义
    #define GPIO_ODR_OD5_Pos (5U)
    #define GPIO_ODR_OD5_Msk (0x1UL << GPIO_ODR_OD5_Pos)// clangd 能理解这种位操作语义
    GPIOA->ODR |= GPIO_ODR_OD5_Msk; 
    
2. 实时语义分析流程
源代码
词法分析
预处理展开
语法分析生成AST
语义分析
符号表构建
提供LSP服务
3. 关键数据结构
数据结构作用嵌入式场景示例
符号表记录所有标识符的位置和类型追踪 DMA_HandleTypeDef 定义
AST保存代码结构关系分析中断处理函数调用链
编译命令库存储项目编译参数处理 -mcpu=cortex-m3 等参数

核心功能实现细节(嵌入式视角)

1. 代码补全如何工作
  • 触发场景:当输入 TIM1->

  • 处理流程

    1. 解析 TIM1 的类型(如 TIM_TypeDef*
    2. 查找该结构体在芯片头文件中的定义
    3. 过滤出当前上下文可访问的成员(CR1/CR2等)
    4. 结合当前编译参数验证有效性
  • 特殊处理:对 volatile 访问的智能提示

    // 能正确提示volatile寄存器成员
    #define ADC1 ((ADC_TypeDef *)0x40012400)
    ADC1->SR |= ADC_SR_EOC; // 输入"->"时提示SR/CR1/CR2等
    
2. 跳转定义实现机制
  • 跨文件追踪:通过预处理器展开结果定位真实定义

    // 案例:跳转到HAL_GPIO_Init定义
    // 用户代码
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);// clangd会:
    // 1. 解析HAL库头文件中的函数声明
    // 2. 结合编译参数中的-I路径
    // 3. 定位到stm32f4xx_hal_gpio.c中的实现
    
  • 处理宏定义的技巧

    #define __STATIC_INLINE __attribute__((always_inline)) static
    __STATIC_INLINE void __WFI() { asm volatile("wfi"); }// 即使是通过宏定义的内联汇编,也能准确跳转
    
3. 实时错误检测原理
  • 深度语义检查

    // 检测寄存器位宽不匹配
    uint8_t temp = GPIOA->IDR;  // 警告: 隐式转换丢失精度(IDR是32位)// 检查中断处理函数属性
    void __attribute__((weak)) TIM2_IRQHandler(void) { // 如果没有重写会给出weak函数警告
    }
    
  • 硬件相关检查

    // 检测错误的寄存器访问顺序
    void FLASH_Program(uint32_t addr) {FLASH->KEYR = 0x45670123; // 缺少解锁顺序检查时会警告FLASH->CR |= FLASH_CR_PG; 
    }
    

嵌入式开发专项优化

1. 处理特殊内存布局
# .clangd 配置示例
CompileFlags:Add: - --target=arm-none-eabi- -D__RAM_FUNC=__attribute__((section(".ramfunc")))- -mlittle-endian- -fshort-wchar
2. 应对分散加载文件
// 通过属性标注特殊段
__attribute__((section(".ccmram"))) uint32_t high_speed_buffer[1024];// clangd会:
// 1. 识别section属性
// 2. 在符号信息中标记特殊段
// 3. 跳转时提示定义位置
3. 调试信息整合
# 生成带调试符号的编译命令
arm-none-eabi-gcc -g3 -gdwarf-4 ... # clangd会利用这些信息增强跳转精度

性能优化技巧

  1. 缓存管理

    # 限制内存使用(适合资源受限环境)
    clangd --background-index --malloc-trim
    
  2. 排除大型自动生成文件

    # .clangd
    If:PathMatch: build/  # 忽略构建目录
    Index:Background: Skip
    
  3. 预生成编译命令

    # 使用bear生成compile_commands.json
    bear -- make -j8 all
    

典型问题诊断

现象:无法识别CMSIS的__packed属性
解决方案

# 在.clangd中添加:
CompileFlags:Add: [-D__packed=__attribute__((packed))]

现象:误报内联汇编错误
处理

void __asm_delay(uint32_t cycles) {__asm volatile ("1: subs %0, #1 \n""   bne 1b      \n": "+r" (cycles));// 添加NOLINT注释抑制错误// NOLINTNEXTLINE(clang-diagnostic-unused-value)
}

工具链协同工作

开发者 VSCode clangd 编译系统 输入代码 发送LSP请求 读取compile_commands.json 构建AST并分析 返回补全/跳转信息 看到智能提示 开发者 VSCode clangd 编译系统

通过这种深度集成,即便是在处理像STM32 HAL库这样复杂的硬件抽象层时,clangd仍然能保持亚秒级的响应速度。建议在开发嵌入式应用时,特别关注编译命令数据库的准确性,这是clangd发挥最大效能的关键。


你的问题非常关键!理解 clangd 的架构设计和工作原理,能帮助我们更好地排查嵌入式开发中的工具配置问题。让我们从「服务器-客户端架构」和「底层实现」两个维度,结合嵌入式开发典型场景进行深度解析。


一、Client-Server 架构全景图

1. 架构角色分工
LSP协议
编辑器/IDE
clangd
代码AST
符号数据库
编译命令库
  • Client(客户端):即你的代码编辑器(VSCode/Vim/Emacs等),负责:
    • 用户输入捕获
    • 界面展示(补全列表/错误波浪线)
    • 发送LSP协议请求
  • Server(clangd):独立进程,负责:
    • 实时解析代码
    • 维护代码模型(AST/符号表)
    • 执行静态检查
    • 响应客户端请求
2. 通信协议细节
  • 传输协议:JSON-RPC over stdio/网络
  • 典型消息流程(以补全为例):
    // 客户端请求
    {"id": 114,"method": "textDocument/completion","params": {"textDocument": { "uri": "file:///project/main.c" },"position": { "line": 42, "character": 15 }}
    }// clangd响应
    {"id": 114,"result": {"items": [{"label": "GPIOA->ODR", "kind": 6},{"label": "GPIOA->IDR", "kind": 6}]}
    }
    

二、clangd 核心工作机制

1. 代码解析三阶段
Client clangd Compiler 打开文件通知 加载compile_commands.json 返回预处理参数 构建AST并缓存 返回初始诊断信息 Client clangd Compiler
2. 关键技术点拆解
技术组件作用嵌入式相关挑战
预处理模拟器处理#ifdef STM32F4等条件编译需要准确传递-DSTM32F407xx等宏定义
AST 内存管理增量更新语法树(避免全量重建)处理大型芯片头文件(如STM32 HAL库)
符号索引引擎跨文件追踪符号(如追踪HAL_GPIO_Init定义)正确配置CMSIS路径
编译参数继承解析compile_commands.json中的-mcpu=cortex-m4等参数匹配交叉编译工具链设置

三、功能实现深度解析(嵌入式视角)

1. 代码补全:硬件寄存器智能提示
  • 场景:输入TIM1->CR1时的处理流程

    // 用户代码片段
    TIM_TypeDef *TIM1 = TIM1_BASE;
    TIM1->  // 在此触发补全// clangd内部处理:
    // 1. 通过AST确定TIM1的类型为TIM_TypeDef*
    // 2. 解析芯片头文件中的结构体定义
    // 3. 过滤出当前作用域可访问的成员(排除通过#ifdef屏蔽的部分)
    // 4. 结合编译参数验证有效性(如是否启用了对应外设)
    
  • 特殊处理案例

    // 处理volatile访问的智能排序
    ADC1->SR &= ~ADC_SR_EOC;  // ADC_SR_EOC会被优先推荐
    
2. 跳转定义:追踪芯片厂商SDK
  • 跨文件跳转流程

    1. 用户请求跳转HAL_UART_Transmit定义
    2. clangd检索符号表,找到声明位置stm32f4xx_hal_uart.h
    3. 结合编译命令中的-I Drivers/STM32F4xx_HAL_Driver/Inc
    4. 定位到具体行号并返回给客户端
  • 处理厂商宏定义的技巧

    // 正确解析STM32的寄存器映射宏
    #define PERIPH_BASE       0x40000000UL
    #define APB2PERIPH_BASE   (PERIPH_BASE + 0x00010000UL)
    #define TIM1_BASE         (APB2PERIPH_BASE + 0x0000UL)
    #define TIM1             ((TIM_TypeDef *)TIM1_BASE)
    
3. 实时错误检测:硬件编程陷阱捕捉
  • 典型检测场景

    // 检测错误的位操作
    uint32_t temp = FLASH->ACR;
    temp |= (1 << 10); // 警告:FLASH_ACR位域只有0-8位有效// 检查中断函数原型
    void TIM2_IRQHandler() {} // 若未添加__weak属性则告警
    
  • 内存屏障检测

    __DSB();    // clangd会检查是否在关键操作后调用了屏障指令
    __ISB();
    

四、嵌入式开发专项配置

1. 编译命令数据库
// compile_commands.json 示例
{"directory": "/project/build","command": "arm-none-eabi-gcc -mcpu=cortex-m4 -I../Drivers/CMSIS/Include -DUSE_HAL_DRIVER ...","file": "../Src/main.c"
}
2. .clangd 高级配置
CompileFlags:Add: - --target=arm-none-eabi- -D__IO=volatile   # 映射CMSIS类型- -nostdlibRemove: [-mfloat-abi=hard]  # 覆盖错误参数Diagnostics:ClangTidy:Checks: - clang-diagnostic-*- bugprone-*CheckOptions:bugprone-too-small-loop-variable.MinimumValue: 4  # 适合嵌入式小循环
3. 处理特殊语法的技巧
// 内联汇编支持
__asm void __WFI() {wfibx lr
}// 配置方法:在.clangd中添加
CompileFlags:Add: [-fintegrated-as]  # 启用GNU汇编解析

五、典型问题排查指南

1. 无法识别芯片特有语法

现象__attribute__((section(".ccmram")))报错
解决方案

# .clangd 配置
CompileFlags:Add: [-D__attribute__(x)=]  # 将厂商扩展属性映射为空
2. 误报内联汇编错误

处理

void delay_cycles(uint32_t cycles) {__asm volatile ("1: subs %0, %0, #1 \n""   bne 1b         \n": "+r" (cycles));// 抑制警告// NOLINTNEXTLINE(clang-diagnostic-unused-value)
}
3. 性能优化手段
# 限制clangd内存使用(适合资源受限环境)
clangd --limit-results=100 --background-index --malloc-trim

六、工具链协同工作示例

开发者 VSCode clangd BuildSystem 输入"TIM1->>CR1" 发送completion请求 查询TIM1的编译参数 返回-mcpu=cortex-m3等参数 解析STM32F1xx.h头文件 生成补全建议列表 返回CR1/CR2等寄存器 显示补全列表 开发者 VSCode clangd BuildSystem

通过这种深度协同,clangd 即使在处理像 STM32 HAL 库这类包含大量硬件相关宏和条件编译的代码库时,仍能保持亚秒级响应速度。建议在嵌入式项目中特别注意 compile_commands.json 的准确性,这是 clangd 正确理解项目配置的生命线。


作为嵌入式开发者,理解 clang-tidy 的核心价值和用法能显著提升代码质量。以下是针对嵌入式场景的深度解析:


一、clang-tidy 的本质与作用

维度说明
定位基于 LLVM/Clang 的静态代码分析工具
核心作用1. 代码质量检查(编码规范)
2. 潜在缺陷检测(内存安全、并发问题)
嵌入式价值发现硬件编程中的隐蔽错误(如寄存器误操作、中断竞态、内存越界)

二、工作原理

源代码
Clang解析AST
加载检查规则
遍历AST节点
匹配规则模式
生成诊断信息
关键技术点
  1. AST 分析:通过 Clang 生成抽象语法树,精准理解代码语义
  2. 规则引擎:200+ 内置检查规则(可自定义扩展)
  3. 上下文感知:结合编译参数(如 -mcpu=cortex-m4)分析硬件相关代码

三、嵌入式开发典型使用流程

1. 基础命令
# 检查单个文件(需传递编译参数)
clang-tidy main.c --checks="*" -- -I./CMSIS -mcpu=cortex-m3 -DSTM32F103xB# 结合编译命令数据库(推荐)
clang-tidy -p build/compile_commands.json src/*.c
2. 配置文件(.clang-tidy)
# 示例:针对裸机开发的优化配置
Checks: >-*,bugprone-*,cert-*,misc-*,clang-analyzer-*,-bugprone-macro-parentheses  # 忽略宏括号警告WarningsAsErrors: '*'  # 严格模式
HeaderFilterRegex: '.*' 
CheckOptions:- key:   readability-magic-numbers.IgnoredIntegerValuesvalue: [0x40000000, 0xDEADBEEF]  # 忽略硬件地址常量- key:   cert-err33-c.WarnOnAnyErrorvalue: true
3. 硬件相关代码处理技巧
// 案例:寄存器访问误报抑制
#define FLASH_BASE 0x08000000Uvoid flash_erase(void) {// NOLINTNEXTLINE(clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling)volatile uint32_t *p_flash = (volatile uint32_t*)FLASH_BASE;*p_flash = 0xDEADBEEF;  // 合法操作但触发常规警告
}

四、嵌入式场景检查示例

1. 中断服务函数检查
volatile uint32_t counter;void SysTick_Handler(void) {// 警告: [concurrency-mt-unsafe]counter++;  // 缺乏保护的共享变量访问// 修复方案:__disable_irq();counter++;__enable_irq();
}
2. 寄存器位操作验证
void UART_Config(void) {USART1->BRR = 8000000 / 115200;  // 警告: [cert-flp30-c] 浮点操作检测// 正确方式(显式整数运算):USART1->BRR = SystemCoreClock / 115200;
}
3. 内存越界检测
#define BUF_SIZE 256
uint8_t dma_buffer[BUF_SIZE];void process_data(int len) {for(int i=0; i<=len; i++) {  // 警告: [bugprone-loop-increment]dma_buffer[i] = 0;        // 当len=256时越界}
}

五、高级应用技巧

1. 与构建系统集成
# Makefile 集成示例
tidy:find Src/ -name "*.c" -exec clang-tidy {} -p build/compile_commands.json \;
2. 持续集成(GitLab CI)
# .gitlab-ci.yml 示例
clang-tidy-check:stage: analysisscript:- apt-get install -y clang-tidy- clang-tidy -p build/compile_commands.json src/*.c
3. 性能优化方案
# 并行执行检查(8线程)
find Src/ -name "*.c" | xargs -P8 -n1 clang-tidy -p build/compile_commands.json

六、原理进阶解析

1. 规则实现机制
// 示例:检测 magic number 的规则实现
class MagicNumberCheck : public ClangTidyCheck {
public:void registerMatchers(ast_matchers::MatchFinder *Finder) override {Finder->addMatcher(integerLiteral(unless(hasParent(fieldDecl())))  // 排除结构体初始化.bind("magicnum"), this);}void check(const MatchFinder::MatchResult &Result) override {const auto *Lit = Result.Nodes.getNodeAs<IntegerLiteral>("magicnum");if (Lit && Lit->getValue() > 10)  // 允许小数字diag(Lit->getLocation(), "避免直接使用魔法数字");}
};
2. 编译参数影响
# 关键参数解析:
--target=arm-none-eabi          # 指定交叉编译目标
-mcpu=cortex-m4                 # 影响地址对齐检查
-DUSE_HAL_DRIVER                # 条件编译相关检查

七、常见问题解决

Q:如何忽略厂商库代码?
# .clang-tidy
Exclude: - "Drivers/**/*.h"   # 排除STM32 HAL库- "**/ThirdParty/**" # 排除第三方代码
Q:处理GCC扩展语法报错
CheckOptions:- key:  cppcoreguidelines-pro-type-vararg.Disablevalue: true  # 忽略可变参数警告
Q:跨平台兼容性处理
# 显式指定目标架构
clang-tidy main.c -- -target arm-none-eabi -mcpu=cortex-m0plus

通过合理配置,clang-tidy 可成为嵌入式开发的“代码卫士”。建议将检查集成到日常开发流程(如 git pre-commit 钩子),并针对项目特点定制检查规则,在代码质量与开发效率间取得最佳平衡。

相关文章:

clangd与clang-tidy

Clangd是基于Clang的Language Server&#xff0c;主要用于提供代码补全、跳转定义、错误提示等IDE功能。而Clang-Tidy则是静态代码分析工具&#xff0c;用于检查代码中的潜在问题&#xff0c;比如风格违规、潜在bug等。 clangd 核心工作原理 1. 基于编译器的精准解析 底层引擎…...

【Linux】冯诺依曼体系结构和操作系统的理解

目录 冯诺依曼体系结构一个例子来深入理解 初识操作系统操作系统的作用设计操作系统的目的操作系统之上和之下分别有啥 管理的精髓&#xff0c;先描述&#xff0c;再组织 冯诺依曼体系结构 我们知道&#xff0c;计算机这个东西发明出来就是帮助人们快速解决问题的。那如果我们想…...

Windows系统Jenkins企业级实战

目标 在Windows操作系统上使用Jenkins完成代码的自动拉取、编译、打包、发布工作。 实施 1.安装Java开发工具包&#xff08;JDK&#xff09; Jenkins是基于Java的应用程序&#xff0c;因此需要先安装JDK。可以从Oracle官网或OpenJDK下载适合的JDK版本。推荐java17版本&#x…...

服务预热原理

Java、Spring、Springboot工程启动后&#xff0c;第一次访问比较慢&#xff0c;而从第二次访问开始就快很多&#xff0c;这通常是由以下几个原因导致的&#xff1a; 类加载与初始化开销 类加载过程&#xff1a;Java程序在启动时需要加载大量的类文件到内存中&#xff0c;包括…...

Python核心编程深度解析:作用域、递归与匿名函数的工程实践

引言 Python作为现代编程语言的代表&#xff0c;其作用域管理、递归算法和匿名函数机制是构建高质量代码的核心要素。本文基于Python 3.11环境&#xff0c;结合工业级开发实践&#xff0c;深入探讨变量作用域的内在逻辑、递归算法的优化策略以及匿名函数的高效应用&#xff0c…...

python环境搭建和pycharm的安装配置以及使用face_recognition与cv2

一.python环境的搭建: 1.下载python&#xff08;这里以python3.11为例&#xff09; step 1&#xff1a;打开下载网址&#xff1a;https://www.python.org/downloads/windows/ step 2&#xff1a;我这里选着python3.11.9的版本 2. 安装我就不说了,网上很多 二.pycharm的安装…...

养生:为健康生活筑牢根基

养生并非遥不可及的目标&#xff0c;而是贯穿于日常生活的点滴之中。从饮食、运动到心态调节&#xff0c;每一个环节都对我们的健康有着重要意义。以下为你详细介绍养生的实用策略&#xff0c;助力你开启健康生活模式。 饮食养生&#xff1a;科学搭配&#xff0c;滋养生命 合…...

linux-----------Ext系列⽂件系统(上)

1.理解硬盘 1-1 磁盘、服务器、机柜、机房 机械磁盘是计算机中唯⼀的⼀个机械设备 磁盘--- 外设 慢 容量⼤&#xff0c;价格便宜 1-2 磁盘物理结构 1-3 磁盘的存储结构 扇区&#xff1a;是磁盘存储数据的基本单位&#xff0c;512字节&#xff0c;块设备 如何定位⼀个扇区呢…...

ts装饰器

TypeScript 装饰器是一种特殊类型的声明&#xff0c;能够被附加到类声明、方法、访问符、属性或参数上。它本质上是一个函数&#xff0c;会在运行时被调用&#xff0c;并且被装饰的声明信息会作为参数传递给装饰器函数。 装饰器的分类 类装饰器 类装饰器作用于类构造函数&…...

未来通信中的大型人工智能模型:基础、应用与挑战的全面综述

题目&#xff1a;A Comprehensive Survey of Large AI Models for Future Communications: Foundations, Applications and Challenges 作者&#xff1a;江沸菠&#xff0c;潘存华&#xff0c;董莉&#xff0c;王可之&#xff0c;Merouane Debbah&#xff0c;Dusit Niyato&…...

青藏高原七大河流源区径流深、蒸散发数据集(TPRED)

时间分辨率 月空间分辨率 1km - 10km共享方式 开放获取数据大小 83.27 MB数据时间范围 1998-07-01 — 2017-12-31元数据更新时间 2024-07-22 数据集摘要 通过构建耦合积雪、冻土、冰川等冰冻圈水文物理过程的WEB-DHM模型&#xff08;Water and Energy Budget-based Distribute…...

5.2 参数管理

目标 访问参数&#xff0c;用于调试、诊断和可视化&#xff1b;参数初始化&#xff1b;在不同模型组件间共享参数。 模型&#xff1a;单隐藏层的MLP import torch from torch import nnnet nn.Sequential(nn.Linear(4, 8), nn.ReLU(), nn.Linear(8, 1)) X torch.rand(size…...

Best Video下载器——抖音视频去水印工具

在浏览抖音时&#xff0c;我们常常会遇到一些精彩的短视频&#xff0c;想要保存下来作为创作素材或与朋友分享。然而直接下载的视频往往带有平台水印&#xff0c;影响观看体验。今天就为大家介绍几种简单实用的去水印方法&#xff0c;让你轻松获取高清无水印视频。 目前市面上…...

C语言_程序的段

在 C 语言程序中,内存通常被分为多个逻辑段,每个段存储不同类型的数据。理解这些段的结构和功能,有助于你更高效地编写、调试和优化程序。以下是 C 语言程序中主要的内存段及其特点: 1. 代码段(Text Segment) 存储内容:编译后的机器指令(程序代码)。特性: 只读:防止…...

Google Earth Pro(谷歌地球)2025大陆版安装教程

软件介绍 【名称】&#xff1a;Google Earth Pro&#xff08;谷歌地球&#xff09;2025 【大小】&#xff1a;63.6M 【语言】&#xff1a;简体中文 【安装环境】&#xff1a;Win/Win8/Winxp/Win10/Win11 谷歌地球(Google Earth) 是由Google公司开发的地图软件。谷歌地球采用了…...

2025年数维杯赛题C题专家 组委会C题专家疑集锦

1、段前段后距&#xff0c;行间距有要求嘛 C题专家&#xff1a;一般是单倍行距 2、请问参考文献和附录上方也要有图示页眉吗?ai使用报告放在附录里还是附录之后? C题专家:附录 3、第三问的那个三天都在一个城市可以吗?这样我们列两份城市的清明自由行&#xff0c;还是说…...

C.循环函数基础

循环函数基础 1. 循环函数基础1.1 循环的定义与作用1.1.1 `for` 循环语法示例1.1.2 `while` 循环语法示例1.1.3 `do-while` 循环语法示例1.1.4 循环的比较1.1.5 循环的应用场景2.1 for 循环语法结构执行流程示例应用场景优点缺点2.2 while 循环语法结构执行流程示例应用场景优点…...

spark-Join Key 的基数/rand函数

在数据处理中&#xff0c;Join Key 的基数 是指 Join Key 的唯一值的数量&#xff08;也称为 Distinct Key Count&#xff09;。它表示某个字段&#xff08;即 Join Key&#xff09;在数据集中有多少个不同的值。 1. Join Key 基数的意义 高基数&#xff1a;Join Key 的唯一值…...

【Oracle认证】MySQL 8.0 OCP 认证考试英文版(MySQL30 周年版)

文章目录 1、MySQL OCP考试介绍2、考试注册流程3、考试复习题库 Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到2025.07.31 之前。所有人均可以免费考取原价245美元 &#xff08;约1500&#xff09;的MySQL OCP 认证。 1、MySQL OCP考试介绍 OCP考试 OCP认证是Oracle公司推…...

不同环境下运行脚本如何解决pythonpath问题

目录 问题背景&#xff1a; 方法一&#xff1a;在 Dockerfile 中设置 PYTHONPATH&#xff1a; 方法二: 本地脚本内动态地设置 sys.path&#xff0c;以确保 Python 程序在运行时能够找到项目中的模块 注意&#xff1a; 问题背景&#xff1a; 脚本在windows环境定义 然后因为…...

照片to谷歌地球/奥维地图使用指南

软件介绍 照片to谷歌地球/奥维地图是一款由WTSolutions开发的跨平台图片处理工具&#xff0c;能够将带有GPS信息的照片导入Google Earth&#xff08;谷歌地球&#xff09;或奥维地图。该软件支持Windows、Mac、iOS、Linux和Android系统&#xff0c;无需下载安装&#xff0c;直…...

visual studio 2015 安装闪退问题

参考链接&#xff1a; VS2012安装时启动界面一闪而过问题解决办法 visual studio 2015 安装闪退问题...

Kubernetes 使用 containerd 实现 GPU 支持及 GPU Operator 部署指南

目录 Kubernetes 使用 containerd 实现 GPU 支持及 GPU Operator 部署指南 一、为什么 containerd 是趋势&#xff1f; 二、目标 三、前提条件 四、方式一&#xff1a;containerd nvidia-container-toolkit&#xff08;基础方式&#xff09; 1️⃣ 安装 NVIDIA Containe…...

【typenum】 1 说明文件(README.md)

Typenum Typenum 是一个用于在编译时计算类型级数字的 Rust 库。目前支持位、无符号整数和有符号整数。 Typenum 仅依赖 libcore&#xff0c;因此适用于任何平台&#xff01; 导入方式 虽然 typenum 分为多个模块&#xff0c;但它们都通过 crate 根目录重新导出&#xff0c…...

Axure疑难杂症:统计分析页面引入Echarts示例动态效果

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 课程主题:统计分析页面引入Echarts示例动态效果 主要内容:echart示例引入、大小调整、数据导入 应用场景:统计分析页面…...

PyQt5基本窗口控件(QWidget)

QWidget 基础窗口控件QWidget类是所有用户界面对象的基类&#xff0c;所有的窗口和控件都直 接或间接继承自QWidget类。 窗口控件&#xff08;Widget&#xff0c;简称“控件”&#xff09;是在PyQt中建立界面的主要元素。在PyQt 中把没有嵌入到其他控件中的控件称为窗口&…...

双目视觉系统中,极线校正(Epipolar Rectification)与单应性矩阵/多平面单应性模型

在双目视觉系统中&#xff0c;极线校正&#xff08;Epipolar Rectification&#xff09;的目标是使左右图像的对应点位于同一水平线上&#xff0c;从而简化立体匹配的搜索过程。标准的双目相机标定和校正流程&#xff0c;其核心原理与单应性矩阵的应用方式如下&#xff1a; 1. …...

【部署】win10的wsl环境下调试dify的api后端服务

回到目录 标题&#xff1a;win10的wsl环境下&#xff0c;远程调试dify的api后端服务 0. 上一篇讲解web前端服务的启动方法&#xff0c;本篇内容是vscode的调试模式启动api后端服务。文章4000字左右&#xff0c;阅读时间15-20分钟。 dify官方运行环境要求较低2U4G&#xff0c…...

学习黑客了解Python3的“HTTPServer“

5 分钟深入浅出理解Python3的"HTTPServer"模块 &#x1f310; 大家好&#xff01;今天我们将探索Python3中的HTTPServer模块——一个简单却强大的工具&#xff0c;它允许你快速创建web服务器。在网络安全学习、渗透测试和CTF挑战中&#xff0c;这个模块常被用来搭建…...

结合 ECharts / Ant Design Blazor 构建高性能实时仪表盘

&#x1f4ca; 结合 ECharts / Ant Design Blazor 构建高性能实时仪表盘 文章目录 &#x1f4ca; 结合 ECharts / Ant Design Blazor 构建高性能实时仪表盘一、前言 &#x1f50d;二、技术选型 &#x1f9f0;三、项目配置与架构 &#x1f3d7;️&#x1f310; 系统整体架构流程…...

刘强东杀入自动驾驶!京东注册“Joyrobotaxi”商标

又一个互联网大佬杀入汽车赛道&#xff01;这一次&#xff0c;是京东的刘强东。5月6日&#xff0c;京东集团旗下公司一口气申请注册了多个名为"Joyrobotaxi"的商标&#xff0c;国际分类涵盖运输工具、科学仪器等核心领域。这一动作被业界普遍解读为&#xff1a;京东要…...

JavaScript基础-switch分支流程控制

在JavaScript编程中&#xff0c;switch语句提供了一种清晰、简洁的方式来实现多路分支选择。相比于多个if...else if语句&#xff0c;switch语句可以使代码更加易读和易于维护&#xff0c;尤其是在需要根据单个变量或表达式的值进行不同路径选择时尤为有用。本文将详细介绍swit…...

MySQL:视图

目录 一、什么是视图 二、视图的创建和使用 三、修改数据 &#xff08;1&#xff09;修改真实表 &#xff08;2&#xff09;修改视图 四、删除视图 五、视图的优点 一、什么是视图 视图是一个虚拟的表&#xff0c;它是基于一个或多个基本表或其他视图的查询结果集。视…...

05 mysql之DDL

一、SQL的四个分类 我们通常可以将 SQL 分为四类&#xff0c;分别是&#xff1a; DDL&#xff08;数据定义语言&#xff09;、DML&#xff08;数据操作语言&#xff09;、 DCL&#xff08;数据控制语言&#xff09;和 TCL&#xff08;事务控制语言&#xff09;。 DDL 用于创建…...

各国GDP变化趋势网页特效(实用动态图表)完整实例

https://download.csdn.net/download/YUJIANYUE/90803109...

【部署】win10的wsl环境下启动dify的web前端服务

回到目录 标题&#xff1a;win10的wsl环境下启动dify的web前端服务 0. 官网安装指引 官网有详细的源代码部署说明&#xff0c;参考: https://docs.dify.ai/en/getting-started/install-self-hosted/local-source-code 1. 安装nodejs 1.1. 下载和解压文件 参考:https://no…...

Veins同时打开SUMO和OMNeT++的GUI界面

进入 Veins 工程目录&#xff08;即包含 sumo-launchd.py 的目录&#xff09;&#xff0c;打开终端设置 SUMO_HOME 环境变量&#xff08;指向你安装的 SUMO 路径&#xff09;&#xff1a; export SUMO\_HOME/home/veins/src/sumo-1.11.0编译 Veins 工程&#xff08;包含 OMNeT…...

模型 启动效应

系列文章分享模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。刺激先行激活&#xff0c;后续认知更顺畅。 1 启动效应的应用 1.1 求职面试中对面试官的影响 背景&#xff1a;一家知名公司在招聘过程中发现&#xff0c;面试官对候选人的评价往往受到多种因素的影响…...

Android 使用Paging3 实现列表分页加载、下拉刷新、错误重试、筛选功能

Android 使用Paging3 实现列表加载 Paging3是Android Jetpack组件库中的分页加载库&#xff0c;它可以帮助开发者轻松实现列表数据的分页加载功能。本文将逐步讲解如何使用Paging3库实现一个带有加载更多、下拉刷新、错误重试、筛选功能的列表页面。 最终效果如下 加载更多、…...

SpringBoot2集成xxl-job详解

官方教程 搭建调度中心 Github Gitee 注&#xff1a;版本3.x开始要求Jdk17&#xff1b;版本2.x及以下支持Jdk1.8。如对Jdk版本有诉求&#xff0c;可选择接入不同版本 clone源代码执行xxl-job\doc\db\tables_xxl_job.sql # # XXL-JOB v2.4.1 # Copyright (c) 2015-present, x…...

洛图报告中的 FSHD 是什么?—— 解密九天画芯推动的三色光源显示技术

目录 一、洛图报告新焦点&#xff1a;FSHD 为何成为显示产业重要突破方向&#xff1f; &#xff08;一&#xff09;洛图报告核心结论&#xff1a;从技术突围到产业重构 二、技术解析&#xff1a;FSHD 如何重构显示底层逻辑&#xff1f; &#xff08;一&#xff09;物理架构…...

关于数据库查询速度优化

本人接手了一个关于项目没有任何文档信息的代码&#xff0c;代码也没有相关文档说明信息&#xff01;所以在做数据库查询优化的时候不敢改动。 原因1&#xff1a; 老板需要我做一个首页的统计查询。明明才几十万条数据&#xff0c;而且我加了筛选条件为什么会这么慢&#xff…...

两数相加(2)

2. 两数相加 - 力扣&#xff08;LeetCode&#xff09; 解法&#xff1a; class Solution { public:ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {ListNode * dummy new ListNode(0);int carry 0;ListNode * head dummy;while (l1 ! nullptr || l2 ! nullptr ||…...

车载学习(6)——CAPL(1)一些基础知识

1.一些CAPL的知识 CAPL通讯访问编程语言&#xff08;Commmunication Access Programming language&#xff09; CAPL的用途 ECU的仿真实现&#xff08;报文的收发、数据的处理&#xff09;实现总线日志纪录的控制实现总线数据自动化分析实现ECU功能的自动化测试实现ECU报文发…...

C++笔记-set和map的使用(包含multiset和multimap的讲解)

1.序列式容器和关联式容器 前面我们已经接触过STL中的部分容器如:string、vector、list、deque、array、forward_list等&#xff0c;这些容器统称为序列式容器&#xff0c;因为逻辑结构为线性序列的数据结构&#xff0c;两个位置存储的值之间一般没有紧密的关联关系&#xff0…...

GLPK(GNU线性规划工具包)介绍

GLPK全称为GNU Linear Programming Kit(GNU线性规划工具包)&#xff0c;可从 https://sourceforge.net/projects/winglpk/ 下载源码及二进制库&#xff0c;最新版本为4.65。也可从 https://ftp.gnu.org/gnu/glpk/ 下载&#xff0c;仅包含源码&#xff0c;最新版本为5.0。 GLPK是…...

技嘉主板BIOS升级

截图可能不同的BIOS长的不一样&#xff0c;但大概相同&#xff0c;BIOS不下错&#xff0c;逐个版本升级就没问题 准备工作 准备工作一个fat32格式的U盘&#xff0c;用来存放BIOS确认主板型号 和当前BIOS版本 方式1&#xff1a;去系统信息里面 方式2&#xff1a; 去BIOS设置…...

自定义类型:结构体进阶

一、结构体类型的声明 前⾯我们在学习操作符和初阶结构体的时候&#xff0c;已经学习了结构体的知识&#xff0c;这⾥稍微复习⼀下。 1.1结构体的回顾 结构是⼀些值的集合&#xff0c;这些值称为成员变量。结构的每个成员可以是不同类型的变量。 1.2结构的声明 struct tag…...

linux perf top分析系统性能

1,看到内核宏是否支持perf功能 perf top -g 查看linux 内核宏定义 CONFIG_PERF_EVENTS=y CONFIG_HAVE_PERF_EVENTS=y CONFIG_FRAME_POINTER=y # 确保帧指针支持以捕获完整堆栈 2,使用perf top -g 报错 Access to performance monitoring and observability operations is l…...

串口屏调试 1.0

http://wiki.tjc1688.com 先把商家的链接贴过来 淘晶驰T1系列3.2寸串口屏tft液晶屏显示屏HMI触摸屏超12864液晶屏 这是主包的型号 打开这个玩意 有十个基本的功能区 新建工程 在界面的右边&#xff0c;指令一定要写在page前面&#xff0c;这里的波特率等等什么的都可以…...