栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

在vscode中使用clangd

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在vscode中使用clangd

资料

  • 使用clangd替代c/c++配置vscode c++项目
  • VScode 中 Clangd 使用
LSP是什么

避免没了解过的人点开网页搜半天,这里一句话说清楚 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++的路径
	]
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/934627.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号