资料
- 使用clangd替代c/c++配置vscode c++项目
- VScode 中 Clangd 使用
避免没了解过的人点开网页搜半天,这里一句话说清楚 LSP(Language Server Protocol):LSP 是一套通信协议,遵从 LSP 规范的客户端(各种编辑器/IDE)可以通过众多 LSP 服务端按协议标准进行通信,由客户端完成用户界面相关的事情,由服务端提编程语言相关的:补全,定义引用查找,诊断,帮助文档,重构等服务。
LSP 关系图
LSP 协议就是一套解偶合的标准,比如 C/C++ 补全,以前是 NotePad++ 里做一套,VS里做一套,Vim里做一套,Emacs里又做一套,C/C++ 还好,但是其他语言就惨了,各个编辑器实现的质量参差不齐。LSP 出现后能让编辑器专心提供最好的用户体验,而 LSP Server 则专心将具体语言的各种集成服务做透,做扎实。
这样同一个 LSP Server 可以服务于不同的编辑器 / IDE,不同的编辑器/IDE 一旦支持 LSP,则可以瞬间对接高质量的各种 LSP Servers。
LSP 服务端和客户端怎么通信的?说起 LSP 服务端大家不要误会成 http server 那样的常驻后台服务,好像编辑器只有通过 TCP发送请求上来才行。实际上,LSP Servers 都是一个个命令行程序,由编辑器(也就是客户端)启动,通过管道发送 JSON RPC 命令同 LSP Server 交流,退出编辑器,LSP 服务端也就关闭了。
有哪些 C/C++ 的 LSP 服务端在 langserver.org 上有表格可以查,纵向是不同 LSP 实现,横向是该实现支持的功能:
目前 C/C++ 的 LSP Server 实现主要有三个:
-
clangd:目前看起来最稳定健壮,但是尚无索引系统,不支持多 Translation Units,所以可以补全,查找定义,但是无法搜索引用。
-
cquery:支持多 Translation Units,可以搜索引用,性能不错,但是稳定性不如 clangd。
-
ccls:cquery 的 fork,据说解决了一些 cquery 的痛点。
clangd 虽然是最稳定的,但不支持查找引用,所以我们选择 cquery 作 C/C++ 的 LSP 服务端。
使用clangd下载clangd,设置环境变量
下载插件,和C++ tools冲突,需要关闭intelisence
在cmake中
//执行参数 cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1 //配置文件 set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
总结一下clangd确实只需要cmaketools即可,如果要debug可以使用c++ tools
在setting.json中配置clangd
{
"clangd.arguments": [
"--background-index", // 在后台自动分析文件(基于complie_commands)
"--compile-commands-dir=build", //compile_command.json相对路径,cmake默认生成在build,自行配置
"-j=12", // 同时开启的任务数量
"--all-scopes-completion", // 全局补全(会自动补充头文件)
"--completion-style=detailed", // 更详细的补全内容
"--header-insertion=iwyu", // 补充头文件的形式
"--pch-storage=memory", // pch优化的位置
"--cross-file-rename",
"--enable-config",
"--fallback-style=WebKit",
"--pretty",
"--clang-tidy", // clang-tidy功能
"--query-driver=clang++" // 告诉clangd用那个clang进行编译,路径参考which clang++的路径
]
}



