linux下用vscode配置clangd教程
1、下载clangd
官网:Releases · clangd/clangd · GitHub
到clangd官网下载.zip压缩包并解压
unzip ./clangd-linux-22.1.6.zip -d /home/orange/ #解压地址填自己的
2、安装vscode和clangd插件
安装vscode:略
安装clangd插件:到vscode的插件市场搜索clangd即可
3、更改插件设置
打开clangd插件的设置
根据自己解压的位置找到文件里的bin/clangd,并将文件地址复制下来
找到"clangd path"选项,将刚才的可执行文件的地址复制到里面
检查并禁用 C/C++ 插件冲突
微软的 C/C++ 插件和 clangd 会争夺代码提示的控制权,导致功能异常。你需要完全禁用前者的智能提示功能。
在 VSCode 中按
Ctrl+Shift+P,输入Preferences: Open Workspace Settings (JSON)并打开。在设置文件中,加入以下两行:
{ "C_Cpp.intelliSenseEngine": "disabled", "C_Cpp.autocomplete": "disabled" } 注意disabled的d不要大写4、生成compile_commands.json
如果你的项目使用 CMake(最常见的情况): 这是最简单的场景。在编译时添加一个参数即可。
# 在项目根目录下执行 mkdir -p build && cd build cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ..
生成后,为了方便 clangd 找到,最好在项目根目录创建一个软链接:
# 在项目根目录下执行 ln -sf build/compile_commands.json .
如果你的项目使用 Makefile: 推荐使用
Bear工具来生成。# 首先安装 Bear sudo apt install bear # 然后,在你平时编译的命令前加上 bear -- bear -- make
这个命令会在当前目录生成
compile_commands.json文件。
5、验证与重启
完成以上步骤后,按以下顺序操作:
重启 clangd:在 VSCode 中按
Ctrl+Shift+P,运行clangd: Restart language server命令。重新加载窗口:如果上一步无效,按
Ctrl+Shift+P,运行Developer: Reload Window重新加载整个 VSCode 窗口。检查索引文件:重新打开项目后,检查项目根目录是否生成了一个名为
.cache的隐藏文件夹。如果有,通常表示 clangd 已成功加载并开始建立索引。
6、一些问题总结
如果还是无法进行代码跳转和代码补全的话,参考以下问题可能能够为你解答
<1>重启clangd,在输出窗口看到以下字样的时候
E[12:54:54.833] error: unknown target ABI 'lp64' E[12:54:54.835] Indexing ... failed: Couldn't build compiler instance
说明你的compile_commands.json中包含了-mabi=lp64这个编译选项,这是GCC(aarch64-none-linux-gnu-gcc)专用的 ABI 指定参数,但 clangd(基于 Clang)并不识别它,导致 clangd 无法创建正确的编译器实例,后续的代码解析、索引、补全都直接失败。
解决方案(二选一)
方案一:通过.clangd配置文件移除该选项(推荐,无需重新生成编译数据库)
在项目根目录(即包含compile_commands.json的目录)下,创建一个名为.clangd的文件,内容如下:
CompileFlags: Remove: [-mabi=lp64]
这个文件会告诉 clangd 在解析每个编译命令时,自动剔除-mabi=lp64这个标志。 保存文件后,在 VSCode 中执行Ctrl+Shift+P→clangd: Restart language server即可。
方案二:重新生成compile_commands.json,从源头去掉该选项
如果你希望彻底清理不兼容的 GCC 选项,可以在生成编译数据库时进行过滤。
若使用 Bear:
bear -- make默认会原样记录所有参数,你可以通过sed或jq后处理删除该字段:# 生成后手动删除 sed -i 's/-mabi=lp64//g' compile_commands.json
若使用 compiledb: 可以加上
--strip-include-paths等选项,但更稳妥的方式还是后处理。