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

clangd-vscode配置

导航

  • 准备工作
  • 文件compile_commands.json
    • 如何生成
      • cmake生成
      • bear生成
      • 其他
      • 观察和理解
    • clangd常见错误以及应对方法
    • .clangd配置文件
  • clangd实时错误输出
  • clangd和vscode配合之下的bug

准备工作

  1. 内核源码linux-imx
  2. python3
  3. 下载scripts/clang-tools/gen_compile_commands.py
  4. vscode和clangd插件,把cpptool插件禁止。

gen_compile_commands.py: 通过*.cmd来生成compile_commands.json

文件compile_commands.json

如何生成

cmake生成

cmake支持compile_commands.json生成。
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON …
或者:set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

bear生成

apt install bear
bear -- make -j8

其他

也可以用其他方式来生成如内核可以用python程序:
scripts/clang-tools/gen_compile_commands.py

观察和理解

观察compile_commands.json中的command字段:其中包含-I/usr/include这样的编译选项,clangd能通过command字段来提取头文件。

  {"command": "/path/aarch64-poky-linux-gcc -Wl -mabi=lp64 --isystem rc-anysee.c","directory": "/mnt/extdisk3/imx8_sdk/kernel/4.14.98/linux-imx","file": "/mnt/extdisk3/imx8_sdk/kernel/4.14.98/linux-imx/drivers/media/rc/keymaps/rc-anysee.c"},

clangd常见错误以及应对方法

  1. –query-driver错误
    观察compile_commands.json中的command字段:其中包含-I/usr/include这样的编译选项,clangd能通过command命令来提取头文件。
    错误:System include extraction: driver clang not found in PATH解决:想办法让compile_commands.json中的command为 绝对路径。
    

Q: --query-driver什么时候可以不配置?
A: 只要保证compile_commands.json的command为绝对路径

.clangd配置文件

参考: .clangd配置文件简介
本人的理解:当compile_command.json

  1. 如果clangd不能识别gcc中的一些参数,可以进行配置
    如下错误: clangd无法识别gcc的参数lp64

E[14:05:24.926] Could not build a preamble for file /linux-imx/drivers/pci/dwc/pci-imx6.c version 1: CreateTargetInfo() return null
E[14:05:24.926]   error: unknown target ABI 'lp64'
E[14:05:24.927] Failed to prepare a compiler instance: unknown target ABI 'lp64'

错误原因:clangd无法识别的编译参数-mabi=lp64(gcc包含-mabi=lp64的参数)。

解决: 编辑.clangd删除,当然也可以Add参数

CompileFlags:Remove: [-mabi=lp64]

clangd实时错误输出

如果clangd配置有问题:当你的鼠标放在函数上,进行导航时,将会出现如下的错误, 这些错误是实时生成的

[Error - 2:34:45 PM] Request textDocument/definition failed.
[object Object]
[Error - 2:34:45 PM] Request textDocument/definition failed.
[object Object]
[Error - 2:34:45 PM] Request textDocument/hover failed.
[object Object]
[Error - 2:36:30 PM] Request textDocument/hover failed.
[object Object]
[Error - 2:36:30 PM] Request textDocument/definition failed.
[object Object]
[Error - 2:36:30 PM] Request textDocument/definition failed.
[object Object]
[Error - 2:36:30 PM] Request textDocument/hover failed.
[object Object]

clangd和vscode配合之下的bug

**前提:**所有的配置都正确,所有的函数和变量都能正确的导航。
Bug:函数跳转到另一个文件时,会出现下面错误。

[Error - 2:48:58 PM] Request textDocument/codeAction failed.
[object Object]
[Error - 2:48:58 PM] Request textDocument/documentHighlight failed.
[object Object]

相关文章:

  • 网络安全之红队LLM的大模型自动化越狱
  • LinuxAgent开源程序是一款智能运维助手,通过接入 DeepSeek API 实现对 Linux 终端的自然语言控制,帮助用户更高效地进行系统运维工作
  • 遗传算法实现单货架库位优化
  • 在Linux系统中安装Anaconda的完整指南
  • vue3代码规范管理;基于vite和vue3、 eslint、prettier、stylelint、husky规范;git触发eslint校验
  • JavaWeb:vueaxios
  • 光触发RFID:破解物流、电力、资产管理三大领域的“不可能三角”
  • 基于 Python 的实现:居民用电量数据分析与可视化
  • 基于SpringBoot的食物营养分析与推荐网站系统
  • 22.晶振的信号与布局布线处理
  • 安卓基础(泛型)
  • 跨语言哈希一致性:C# 与 Java 的 MD5 之战?
  • 搭建speak yarn集群:从零开始的详细指南
  • C++(初阶)(十三)——继承
  • 【C++11特性】Lambda表达式(匿名函数)
  • 职坐标IT培训破局AI风口新赛道
  • 「Mac畅玩AIGC与多模态06」开发篇02 - 开发第一个知识库问答应用
  • MANIPTRANS:通过残差学习实现高效的灵巧双手操作迁移
  • MYSQL-OCP官方课程学习截图
  • K8s新手系列之K8s中的资源
  • 港交所与香港证监会就“中概股回流意向”已与部分相关企业进行接触
  • 言短意长|新能源领军者密集捐赠母校
  • 最近这75年,谁建造了上海?
  • 北美票房|《罪人》遭媒体唱衰,好莱坞业内人士集体反击
  • 国家税务总局:“二套转首套”可以享受贷款利息个税专项扣除
  • 劳动最光荣!2426人受到表彰