clangd-vscode配置
导航
- 准备工作
- 文件compile_commands.json
- 如何生成
- cmake生成
- bear生成
- 其他
- 观察和理解
- clangd常见错误以及应对方法
- .clangd配置文件
- clangd实时错误输出
- clangd和vscode配合之下的bug
准备工作
- 内核源码linux-imx
- python3
- 下载scripts/clang-tools/gen_compile_commands.py
- 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常见错误以及应对方法
- –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
- 如果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]