Clangd + VSCode使用方法

clangd 是基于 Clang 编译器的 C/C++/Objective-C 语言服务器。 它提供类似 IDE 的功能,例如代码补全、跳转导航、重构和诊断,并可在支持 LSP(语言服务器协议)的编辑器中使用,如 VSCode、Neovim、Sublime 等。 代码补全(Code completion) 在你输入代码时,自动建议变量、函数和类型。 跳转到定义 & 查找引用(Go-to-definition & Find references) 一键跳转到符号的定义,或查找它在何处被使用。 诊断与警告(Diagnostics & warnings) 不用手动编译,编辑器中就能显示编译错误和警告。 重构 & 代码操作(Refactoring & code actions) 支持重命名符号、生成函数框架、自动修复 include 等。 请确保在项目根目录下有一个 compile_commands.json 文件。 👉 参考文档:JSON Compilation Database CMake(2.8.5 及以上版本)支持在使用 Unix Makefile 构建时,通过设置 CMAKE_EXPORT_COMPILE_COMMANDS 选项来生成这个编译数据库。 但是也可以用Bear来生成。 brew install bear bear -- make clean all 但是我在Mac平台下使用arm-none-eabi-gcc来进行交叉编译的时候,bear生成的compile_commands.json里只有[]。 我懒得找解决方法,就直接用compiledb最后生成了compile_commands.json: 在VSCode中Ctrl + Shift + P打开 Preferences: Open Settings(JSON)编辑settings.json 或手动去寻找: ...

October 23, 2025 · LingC

Keil5 编译错误 error: call to undeclared function '__enable_irq'

stm32f1xx_hal_i2c.c 中 __enable_irq 和 disable_irq 函数出现了报错: error: call to undeclared function '__enable_irq'; ISO C99 and later do not support implicit of function declarations 在 core_cm3.h -> cmsis_compiler.h -> cmsis_armclang.h (ARM Compiler 6) 或 cmsis_armcc.h (AC5) 中对这两个方法没有定义,只有一段注释: __enable_irq 和 disable_irq 控制的是PRIMASK寄存器值。 是一种 intrinsic 函数,编译器会自动识别并替换为相关的指令,它们其实是编译器的一部分,实际的定义位于Keil的 arm_compat.h 中。 /* * Arm Compiler 6 (armclang) */ #elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) #include "cmsis_armclang.h" 在其中,这个头文件 arm_compat.h 本该是不存在的: #include <arm_compat.h> 在.\Drivers\CMSIS\Include 中多了一个arm_compat.h文件,这会导致覆盖编译器的头文件,所以会出现一系列错误。 ...

September 6, 2025 · LingC

BTSNOOP is FUN!

手机 HCI 日志记录 在VIVO手机中的开发者选项,启用蓝牙 HCI 信息手机日志。 用USB连接电脑后,将 USB连接方式 调整为传输文件。 adb bugreport vivo_btsnoop 会在 /data/user_de/0/com.android.shell/files/ 下生成日志,并自动拉取到电脑上。 在 bugreport.zip 下的 \FS\data\misc\bluetooth\logs 中能找到 HCI log: Knowledge Base UUID UUID(Universally Unique Identifier)是一个 128位(16字节) 的唯一标识符,用于标识蓝牙协议中的各种组件 Services Characteristics Descriptors 的类型和功能。 Service Service 是蓝牙设备提供的 功能集合,每个 Service 包含一个或多个 Characteristic Service 也分为 Primary Service 和 Secondary Service Characteristic Characteristic 是 Service 中的 具体数据点,用于 读取、写入、通知 数据。 每个 Characteristic 包含: Value:存储的数据(如温度、心率等)。 Properties:定义操作权限(read、write、notify 等)。 Descriptors:额外配置(如通知开关)。 抓包 我已经知道这是一个蓝牙低功耗(BLE)设备,只需找到Attribute Protocol通信: ...

August 1, 2025 · LingC

Protobuf

安装 protobuf 假设环境下已有protoc (protocal buffers compiler)。 对于 Go 语言,安装相应的可执行文件: go install google.golang.org/grpc/cmd/protoc-gen-go@latest go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest 在Windows中,执行完安装命令后在C:\Users\user\go\bin路径下会有proctoc-gen-go.exe和protoc-gen-go-grpc.exe。 安装完Go插件后,我们希望protoc生成Go语言的代码,需要为 .proto 文件加一行以指定生成的Go包名: syntax = "proto3"; package com.example.pkg option go_package = "example/gopkg" 如果需要使用 grpc 服务,安装包: go get google.golang.org/grpc 之后便可启动一个 gRPC 服务器: gRPC gateway 为 gRPC 服务生成面向 RestFul API 的网关 go install github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-grpc-gateway@latest go install github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2@latest syntax = "proto3"; package com.example.pkg import "google/api/annotations.proto"; option go_package = "example/gopkg service AuthService { rpc Login(LRequest) returns (LResponse) { option (google.api.http) = { post: "/v1/login" body: "*" }; } message LRequest { string field = 1; } message LResponse { string field = 1; } 之后便可以生成grpc gateway的代码了: ...

January 24, 2025 · LingC

Android设备安装Debian成为BT下载服务器

文章介绍了如何在Android设备上通过Termux安装Debian,并配置VNC以便远程访问。作者提到,由于Android 12引入的Phantom Process Killer机制,Termux容易被杀死,因此提供了关闭该限制的ADB命令。接着,文章详细说明了如何安装XFCE桌面环境和配置VNC服务器,包括使用TightVNC的步骤。最后,作者提到可以进一步安装gogs作为本地Git服务器。

August 7, 2024 · LingC

[双系统] Windows 更新摧毁了我的Linux系统

在 Windows 更新后,用户的 Linux 系统因等待 90 秒而无法启动,并且出现依赖失败。调查发现,Windows 调换了 Linux 分区和恢复分区的顺序,从而导致了问题。用户通过修复 Linux、更新 fstab、重新安装 Grub 和使用 efibootmgr 更改启动顺序解决了问题。

August 3, 2024 · LingC

Golang embed 使用问题

Golang 使用 embed 包在编译时将外部文件包含到二进制程序中。使用 embed 指令可以将 html、css、js 等静态文件添加到二进制文件中,而无需额外的资源文件。嵌入文件可以使用字符串、[]字节和 FS 来引用。但也有一些限制,如文件层次结构问题和复杂路径问题。例如,如果嵌入文件和被嵌入文件不在同一层次,嵌入模式将无法成功解析。另一个问题是处理复杂路径,即静态文件夹被放置在嵌入文件的子文件夹中。解决办法是使用 io/fs 软件包中的 Sub 方法来处理这些复杂路径。

December 27, 2023 · LingC

通过汇编分析栈、函数调用 esp&ebp

栈是一种遵循后进先出(LIFO)规则的数据结构,通常用于内存管理。重要寄存器包括栈指针(SP)和基指针(BP)。在函数调用中,使用push将参数压入栈中,call指令保存返回地址。ESP寄存器指向栈顶,函数执行后需平衡栈。C语言函数调用中,参数通过EBP寻址,编译器可能使用mov而非push,使得ESP不指向栈顶,简化栈平衡的处理。

December 15, 2023 · LingC

Git push 出现 permisson denied error 403

在尝试使用 git push -u origin main 时,出现了权限错误,提示旧用户被拒绝访问。为了解决这个问题,作者尝试通过 git commit --amend --reset-author 重置提交作者,但问题依旧。最终在 Stack Overflow 找到解决方案:删除旧的凭证,成功解决了问题,节省了一个小时的时间。

September 15, 2023 · LingC

坑:Litepal save方法返回true却没有保存

在开发 Madoka 日记时,做到导出导入的功能时,我想偷个懒导出直接用 Gson 将 Java 对象转换为 json 然后放在 txt 中,导入的时候再将 json 转为 javaBean 就行啦。 而数据库我用的是 Litepal 直接搞,使用这个库的好处就是速度快,方便,适合新手。 但其实 sqlite 的语法和一些其他的语句并不难,所以用这个库就是为了方便… 使用 Litepal 储存数据时,需要调用 save() 方法。 这里我就遇到了一个问题,明明 save() 方法返回的是 true ,但数据库里没有需要保存的数据啊? Gson gson = new Gson(); Diary diary = gson.fromJson(json, Diary.class); return diary.save(); 这是调用 Gson 将 json 转换为 javabean 对象。 明明 Diary 的内容全是正确的,我开始询问度娘。 结果没找到跟我的问题直接相关的文章,结果我看到了有个人在吐槽啥 setting getting,我就想到了会不会是因为没有调用 Diary 的构造方法? Diary 作为一个 Litepal 的,它是继承自 LitePalSupport 的,会不会是因为没有调用 LitePalSupport 的构造方法呢? 我将导入代码改了一下: Gson gson = new Gson(); Diary diary = gson.fromJson(json, Diary.class); Diary saveDiary = new Diary(); saveDiary.setId(diary.getId()); saveDiary.setCreatedTime(diary.getCreatedTime()); saveDiary.setLastUpdatedTime(diary.getLastUpdatedTime()); ... 省略一万个代码 return saveDiary.save(); 果然,最后正常了… ...

February 24, 2020 · LingC