Clangd Troubleshooting

无法识别编译参数宏定义

在使用clangd时,如果在编译参数中定义了宏,即使使用bear生成了compile_commands.json,里面的编译参数中带上了-DLAB_PGTBL参数,clangd仍然无法识别定义了该宏。

compile_commands.json

宏定义无法识别

statckoverflow上有同样问题,回答通过添加compile_flags.txt文件并在其中添加宏定义,但该文件在compile_commands.json存在时失效

查阅clangd文档,此时应该为项目添加项目配置文件.clangd,在编译指令中添加参数

1
2
3
#.clangd
CompileFlags:
Add: [-DLAB_PGTBL, -DSOL_PGTBL]

宏定义成功识别

编译参数导致clangd解析失败

Linux内核使用clangd解析报错,会提示Unknown argument: '-fno-allow-store-data-races'Unknown argument: '-fconserve-stack'Unknown argument: '-femit-struct-debug-baseonly'等错误

image-20230719015128903

同样通过在Linux目录下添加.clangd文件,忽略这些导致clangd失效的参数:

1
2
CompileFlags:
Remove: [-fconserve-stack, -fno-allow-store-data-races, -femit-struct-debug-baseonly]

接下来代码中不显示报错了,但仍然无法实现跳转,在clangd的输出中可以看到如下内容:

1
2
3
4
5
6
7
8
>>> {
"error": {
"code": -32001,
"message": "invalid AST"
},
"id": 11,
"jsonrpc": "2.0"
}

提示抽象语法树错误,但实际上并非错误原因,在输出中搜索错误的日志E[,发现一行error: unknown target ABI 'lp64'。搜索lp64是编译时的一个参数-mabi=lp64,因此将其也忽略掉。

1
2
CompileFlags:
Remove: [-fconserve-stack, -fno-allow-store-data-races, -femit-struct-debug-baseonly, -mabi=lp64]

此时,重启vscode窗口,Linux内核代码已经能够正常解析。


Clangd Troubleshooting
https://xanderc.top/2023/06/02/clangd-troubleshooting/
作者
XanderC
发布于
2023年6月2日
许可协议