Windows VSCode + XMake + Clangd 配置踩坑
Windows VSCode + XMake + Clangd 配置踩坑
尝试用 Clangd 代替 Intellisense 进行实时语法检测,但是遇到了很多问题。
配置基础参考了 https://zhuanlan.zhihu.com/p/566506467。
Prerequisite
VSCode 安装 clangd 扩展。
如果系统没有安装 clangd 它会自己下载一个到插件共享文件目录,并且设置 clangd 的路径。
XMake 的官方文档提到了如何使用 clangd:https://xmake.io/#/zh-cn/plugin/more_plugins?id=clangd。只需禁用 C/C++
的语法提示功能,并设置 compile-commands-dir
。
因为 clangd 会和 C++ 扩展功能冲突,需要关闭 C/C++ 扩展功能(安装 clangd 扩展后也会提示你禁用,其实禁用 intellisense 即可)。clangd 也需要知道编译命令,这个可由 XMake 提供(编辑 xmake.lua
后会自动更新,如果没有则执行命令 XMake: UpdateIntellisense
重新生成),默认位于 .vscode
目录下。
需要在参数中告诉 clangd。于是得到了这样的 settings.json
:
{
"C_Cpp.codeAnalysis.runAutomatically": false,
"C_Cpp.intelliSenseEngine": "disabled",
"C_Cpp.formatting": "disabled",
"C_Cpp.autoAddFileAssociations": false,
"C_Cpp.autocompleteAddParentheses": false,
"C_Cpp.autocomplete": "disabled",
"C_Cpp.errorSquiggles": "disabled",
"clangd.arguments": [
"--compile-commands-dir=.vscode"
]
}
然后打开文件夹,创建 XMake 项目(默认的 Hello World 即可),使用上述 settings。clangd 配置更新时不需要重启窗口,可以直接 Ctrl+Shift+P
执行命令 clangd: restart language server
。
然后可能发现它显示如下问题,显然是找不到标准库头文件。
Problems with GCC
对于 gcc,可能是因为没有设置 --compile-commands-dir
。官网是这样解释的:找不到用户头文件是因为 compile_commands.json
路径没配置好,找不到标准库头文件则可能因为根据编译器路径搜索失败,需要手动指定 query-driver
。
正常应该是这样的。
然后试试 C++20,提示一堆错。这是当然的,因为 XMake 没有设置语言标准……
加上 set_languages("c++20")
,重启 clangd,再执行,没有问题。
但是下面问题来了,我想把语言标准设为 c++23,而这个是 gcc 和 msvc 早就支持的。编译当然没问题,但是 clangd 裂了,提示 c++23 不合法……
是这个版本的 clangd 不支持 c++23 标准?其实是它只认 "-std=c++2b"
。需要在 compile_commands.json
把 c++23
改成 c++2b
。但命令是 XMake 自动生成的,所以需要在 xmake.lua
里改 set_languages("c++2b")
。
但这样并不意味着万事大吉。注意到它提示 algorithm
有问题。STL 本身肯定没编译问题的,只能是 clangd 的分析有误。
最后一图是 auto(x)
分析有误,但 clangd 在 15 就支持了 c++23 的 auto(x) and auto{x}
,有点怪。
其实 gcc 的 libstdc++ 本来就是为自家写的,一些语法也得靠自家编译器来解析。同理 clangd 也更偏好自家的 clang。只有这么点分析失败的地方也不容易了。
Try MSVC
最后考虑用 msvc 编译。更新 compile_commands.json
,重启 clangd,它又炸了。
这里尝试设置 query-driver
也不起作用。
可能因为 MSVC 的编译命令格式和 clangd 差异太大,clangd 不识别。我尝试搜索过让 clangd 支持 MSVC 的方法无果。所以在用 clangd 的情况下还是别用 MSVC 了。