最近在用 VSCode 写数据处理代码的时候,经常碰到 VSCode 响应非常慢、甚至卡死的情况。通过查看进程占用情况,基本可以确定是 MSVC 的 IntelliSense 导致的。MSVC 的 IntelliSense 在处理大型项目或者复杂代码时性能很差。在 Gemini 的建议下,我尝试使用 clangd 来替代 MSVC 的 IntelliSense,结果非常不错。

clangd 是基于 LLVM 的 C / C++ 语言服务器,提供了代码补全、错误检查、跳转等功能。相比 MSVC 的 IntelliSense,clangd 的性能更好,响应更快,尤其是在大型项目中表现更为出色。不过缺点是我很多代码的函数注释使用的是 Doxygen 风格,MS 官方的插件可以拦截渲染请求,将注释渲染到函数的说明中去,但是 clangd 无法做到这一点,最后只能通过命令行的 doxygen 生成文档,再通过插件在 VSCode 中查看文档。

安装 clangd

除了在 VSCode 中安装 clangd 插件之外,还需要在系统中安装 clangd,例如 Ubuntu 可以直接用 apt 安装:

1
sudo apt install clangd

Make 工程

对于 Make 工程,需要生成 compile_commands.json 文件,clangd 通过这个文件来了解项目的编译选项。可以使用 Bear 工具来生成 compile_commands.json:

1
2
sudo apt install bear
bear -- make -j4

CMake 工程

对于 CMake 工程,可以直接在 CMakeLists.txt 中添加以下内容来生成 compile_commands.json:

1
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

但是一般情况下,CMake 会将 compile_commands.json 生成在构建目录中,而 clangd 默认会在项目根目录中寻找这个文件。可以通过创建一个符号链接来解决这个问题:

1
ln -s build/compile_commands.json compile_commands.json

或者在配置文件中指定 compile_commands.json 的路径:

1
2
3
"clangd.arguments": [
"--compile-commands-dir=${workspaceFolder}/build",
]

另外如果碰到了标准库无法找到的问题,可以在 VSCode 的设置中添加以下配置来指定标准库的位置:

1
2
3
"clangd.arguments": [
"--query-driver=/usr/bin/g++*,/usr/bin/gcc*,/usr/bin/c++*"
]