vscode + clangd 开发 c\c++

本文介绍如何利用 Clangd 提升 VSCode 的 C++ 开发体验,包括快速修复、智能头文件引入及静态代码检查等功能,并提供详细的配置指南。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


强烈推荐clangd!微软官方的插件一言难尽,原来没有对比就凑活用得了,有对比以后,简直没办法忍受。

背景

vscode c++开大家一般用 vscode 自家出品的c++插件,如下

在这里插入图片描述
网络大部分的vcscode c++ 环境搭建也都是讲这个插件的配置,用于提供悬浮提示,代码补全,错误提示,定义声明实现之间的项目跳转等等功能。
我之前也是用这个插件开发,非常难用,和一些更现代化的IDEA有不小差距。

先不说导航找实现找引用这种语义分析的基本功能有时候都没办法正确找到实现,速度也一般般,错误和警告也只是有提示,没有quick fix功能,这个功能是能极大提高编程手感的东西,非常好用,可惜用不得。

LSP

LSP(Language Server Protocol)开源的语言服务器协定。由红帽、微软和 Codenvy 联合推出,可以让不同的程序编辑器与集成开发环境(IDE)方便嵌入各种程序语言,允许开发人员在最喜爱的工具中使用各种语言来撰写程序。

个人暂时没有去细致了解其中细节,lsp只是一种编辑器和语言服务器(language server)之间的一套协议罢了,编辑器通过lsp将代码传给语言服务器做语义分析,语言服务器在根据lsp传给编辑器做渲染解析或者异常提示之类的。
lsp做了一个中间人适配器的角色,以避免不同后端语言+不同编辑器,不同组合都得重复开发的问题

当然以上只要大概知道lsp是啥就行了。

然后发现c++ 的语言服务器实现lsp,比较常见的就是以下三个。

  • ms-vscode.cpptools
  • clangd
  • ccls

在这里插入图片描述

实现了的LSP的语言服务器列表

Clangd

clangd官网介绍

看了半天,挑了clangd,代码补全之类的基本的功能就不提了,吸引我的主要是clangd几个特性特别强大,牛逼就完事了。

另外find reference之类的命令明显比cpp tools快的多。

不过主要针对CMAKE管理的项目,因为要生成一个compile_command.json的文件,其他的makefile之类的项目生成这个文件比较麻烦。

quick fix

对于一些常用错误,他可以提供快速修改功能,比如漏了命名空间啥的,或者对于一些三方组件没记得太清楚是属性(a.data())还是数据成员(a.data)这种错误,可以提供快速修复方案。
在这里插入图片描述

IWYU

include-what-you-use,又是一个非常给力的一个功能。
比如写个mutex,我们必须自己手动转到文件顶部手动include,有时候有些还得查查需要的头文件名叫啥,代码写起来就是不丝滑爽快。

有了IWYU,就可以自动添加头文件,这种写代码你就可以专注于业务,减少找头文件切换行include的操作,非常好用。
在这里插入图片描述
在这里插入图片描述

clang-tidy

集成了clang-tidy,基于AST的静态检查工具,提供繁多的检查项,一些常见bug,大小驼峰之类的命名规范,性能提升建议,内容很多,可以自行了解,大部分vscode支持。
clang-tidy list

在这里插入图片描述
如上图,检查出一个死循环bug。不过部分checks vscode不支持显示,比如上面的DivideZero没有提示,手动调用LLVM全家桶里面的clang-tidy是支持该check,但是vscode不显示。

不清楚是clangd集成的clang-tidy阉割了还是vscode的问题,不过锦上添花的东西无伤大雅。
在这里插入图片描述

环境配置

特性了解完了,就开整吧。

插件配置

在这里插入图片描述
安装如图插件。
插件设置如下,特性拉满。

    "clangd.arguments": [
        "--background-index",
        "--compile-commands-dir=build",  //compile_command.json相对路径,cmake默认生成在build,自行配置
        "-j=12",
        "--all-scopes-completion",
        "--completion-style=detailed",
        "--header-insertion=iwyu",
        "--pch-storage=memory",
        "--cross-file-rename",
        "--enable-config",
        "--fallback-style=WebKit",
        "--pretty",
        "--clang-tidy"
        // 网上别人配置clang++,但我这边windows、linux实测不加这行也没啥问题,可能mac可能需要另外加
    	"--query-driver=clang++",
    ],

语言服务器下载

ctrl + shift + p 调用
在这里插入图片描述

下载安装完完提示重启vscode,没啥需要手动配的,有时候会下载安装失败,多试几次就好。

当然下载官网LLVM全家桶也是可以的。

自定义配置

剩下的是一些个人喜好的配置了。
在这里插入图片描述

自用配置,看个人喜好,具体语法可以看官网介绍

CompileFlags:                             
    Add: 
      [
        -std=c++14,
        -Wno-documentation,
        -Wno-missing-prototypes,
      ]
Diagnostics:
  ClangTidy:
    Add:
    [
        performance-*,
        bugprone-*,
        modernize-*,
        clang-analyzer-*,
        readability-identifier*,
    ]
    CheckOptions:
      readability-identifier-naming.VariableCase: camelCase

生成compile_command.json

vs的generater 无法生成该文件,换其他的Ninja 之类的gennerater

clangd需要根据该文件获取各个文件的include path,以及编译警告错误之类的,必须要有这个文件

如果使用了 cmake tool,可以用以下配置生成。
在这里插入图片描述

也可以

cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1

又或者在cmakelist里面

set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

都是一样的。

生成的内容大致如下

[
  { "directory": "/home/user/llvm/build",
    "command": "/usr/bin/clang++ -Irelative -DSOMEDEF=\"With spaces, quotes and \\-es.\" -c -o file.o file.cc",
    "file": "file.cc" },
  ...
]

这样配置下来,,再禁用vs cpptools 的自动补全(补全会冲突),当然你没有debug的需求的话,可以直接删除cpptools。

这样就可以愉快的使用clangd的特性进行开发了。

makefile生成compile_command.json

makefile生成compile_command.json

### 配置VSCodeClangd以支持RT-Thread开发环境 为了使 Clangd 能够正确解析 RT-Thread 嵌入式系统的代码,在 VSCode 中需要特别配置 Clangd 的设置来识别交叉编译工具链以及相应的头文件路径。 #### 安装必要的扩展 安装 Microsoft 提供的 C/C++ 扩展包,该插件集成了 Clangd 支持。通过 Visual Studio Code 的市场可以找到并安装此扩展[^1]。 #### 设置 `c_cpp_properties.json` 文件 创建或编辑工作区中的 `.vscode/c_cpp_properties.json` 文件,指定编译器路径和其他选项以便于 IntelliSense 和 Clangd 正确理解项目结构: ```json { "configurations": [ { "name": "Win32", "includePath": [ "${workspaceFolder}/**", "/path/to/rt-thread/include", // 添加 RT-Thread 头文件目录 "/usr/lib/gcc/arm-none-eabi/*/include" // GCC ARM Embedded Toolchain 包含路径 ], "defines": [], "compilerPath": "/usr/bin/arm-none-eabi-gcc", // 使用正确的交叉编译器路径 "intelliSenseMode": "linux-armgcc-x64", "cStandard": "gnu11", "cppStandard": "gnu++14" } ], "version": 4 } ``` #### 编写 `.clangd` 配置文件 在同一位置下编写名为 `.clangd` 或者 `_clangd` (Windows) 的文本文件,用于进一步细化 Clangd 行为: ``` CompileFlags: Add: [-I/path/to/rt-thread/include, -target arm-none-eabi] Diagnostics: UnusedArguments: false If: PathMatch: '.*' Then: CompileFlags: Add: ["--sysroot=/opt/gcc-arm-none-eabi"] ``` 上述配置指定了目标架构为目标平台,并加入了系统根(`--sysroot`)参数指向交叉编译所需的库与头文件所在的位置。 #### 更新 `tasks.json` 构建任务 确保项目的构建命令能够调用正确的交叉编译器来进行编译操作。可以在 `.vscode/tasks.json` 中定义如下内容: ```json { "version": "2.0.0", "tasks": [ { "label": "build", "type": "shell", "command": "make", "args": [ "-j8", "CC=arm-none-eabi-gcc", "CXX=arm-none-eabi-g++" ] } ] } ``` 这样就完成了基本的配置过程,使得 Clangd 可以为基于 RT-Thread 的嵌入式应用提供良好的编码体验和支持。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值