VSCode 开发 STM32 - clangd 带来的极致补全体验

发布于:2025-07-24 ⋅ 阅读:(13) ⋅ 点赞:(0)

之前一篇文章中我们已经介绍了基于 VSCode 的 MCU 开发方案:

再也不用担心律师函啦,MCU 开发的终极开源解决方案!https://mp.weixin.qq.com/s?__biz=Mzg3ODY0MjM2NA==&mid=2247499052&idx=1&sn=b07f89766196d7aec51bb4c5029d8b6e&scene=21#wechat_redirect

然而,工欲善其事,必先利其器,一个开发者对于其开发工具的探索是永无止境的,恰好 VSCode 拥有着各种各样的插件,这就使其有着无穷的拓展可能性。本次要介绍的就是其 clangd 插件 —— 一款代码智能分析/补全/跳转工具。

原本我一直用的都是微软官方的 C/C++ 插件,但该插件有时候会出现补全失效或跳转失败的问题,正好前段时间一个朋友给我推荐了 clangd,试用后一下被其代码分析的智能度给折服了,其甚至会自动给每个函数的参数加上形参名提示,大大提高了代码的可读性!(注意 clangd 与 c/c++插件不兼容,如需使用其中一个需要卸载另一个)当然,它的功能并不仅仅在于代码补全,根据官方描述,其主要有以下特性:

  • 代码补全:在你输入代码时,智能地推荐变量名、函数名等,提升编码效率。

  • 编译错误和警告:实时检测代码中的错误和潜在问题,避免编译时才发现错误。

  • 跳转到定义和交叉引用:快速定位变量、函数、类型的定义位置,方便代码阅读和理解。

  • 悬停信息和内联提示:鼠标悬停显示详细信息,内联提示显示额外的代码上下文,帮助理解代码含义。

  • 包含管理:帮助自动添加、移除或整理头文件引用,减少手动管理的麻烦。

  • 代码格式化:自动调整代码格式,保持代码风格一致。

  • 简单重构:支持如重命名变量等基本代码重构操作,提高代码质量和维护性。

当然,今天我们先一起将这个插件用起来,后续再对其进行更深入的探索。

在 C/C++ 体系下,clangd 对于代码的理解需要基于编译标志,因此其需要有一个文件帮助提供这些标志,在这里就是 “compile_commands.json”。

这个文件可以通过几种工具来生成,而最常用的或者说对于开发我们 STM32 最方便的,就是 CMake,因为 CubeMX 自带生成 CMake 工程的功能!

由于之前我们是使用的 Make 功能,而本次要使用 CMake 工程,因此在上一篇文章的环境基础上,我们需要额外安装 CMake 工具,下载官网如下:

https://cmake.org/download/

下载好后我们可以在命令行中输入 cmake 来测试是否安装成功,安装成功会有如下提示:

PS C:\Users\19310> cmake
Usage

  cmake [options] <path-to-source>
  cmake [options] <path-to-existing-build>
  cmake [options] -S <path-to-source> -B <path-to-build>

Specify a source directory to (re-)generate a build system for it in the
current working directory.  Specify an existing build directory to
re-generate its build system.

Run 'cmake --help' for more information.

安装完成后我们在 VSCode 中安装 Cmake Tools 插件:

图片

该插件可以帮助我们以可视化按钮的形式编译 CubeMX 生成的工程。

紧接着就是在 VSCode 中 安装我们本文的主角 —— clangd 插件:

图片

安装完成后,我们使用 CubeMX 生成一个 CMake 工程,基本操作与开头提到的那篇文章完全一致,只需在 Project Manager 界面下的 Toolchain/IDE 这一栏选择 CMake 即可:

图片

创建好工程后使用 VSCode 打开该工程的根目录,由于是第一次打开,VSCode 的 Cmake Tools 插件会提示让我们选择一个构建预设:

图片

此时我们先不要选择,因为 CubeMX 默认的 CMake 工程是基于 Ninja 这个构建系统的,而根据我们上一篇文章的配置,我们使用的是 Make,因此需要修改一下 CMakePresets.json 这个文件,将 configurePresets 中 generator 的值改为 “MinGW Makefiles”:

图片

此时我们可以重启 VSCode 或者在 CMake 插件功能界面点击 Configure再次唤起预设配置的选择:

图片

这里我们选择 Debug,其和 Release 的差别就是编译是否包含调试信息以及编译的优化级别等(此处为笔者猜测,并未实际验证,如有补充或是指正欢迎在评论区提出),因为我们正常开发需要进行调试,因此就选择 Debug。

选择完成后 VSCode 就会借助插件对工程进行一系列的编译配置和工具链的检测,没有任何问题的情况下会生成 build/Debug 目录,可以看到其中已经自动生成了 compile_commands.json 这个文件:

图片

此时我们进入随意一个 .c 源文件后发现右下角会弹出一个提示框:

图片

意思是未找到 clangd 语言分析服务器,并且提供了一个安装按钮,实际上我们之前安装的插件还需要配合这个语言分析服务器才能够起作用,这里我们直接点 Install 安装即可(如安装失败大概率是外网访问问题,此处可以多试几次或者科学上网)。看到类似以下提示框则表示安装成功。

图片

此时查看 main.c 发现开始出现红色警告,且有的函数能跳转(当前文件内函数和定义),有的不行(外部函数和定义):

图片

这表明我们的 clangd 已经运行起来,但由于 clangd 默认只会在项目根目录以及其 build 子目录去搜寻 compile_commands.json,而我们当前的这个文件在 build/Debug 下,因此这里需要显示指明其路径。

我们在项目根目录新建一个 .vscode 目录,再新建一个 settings.json 文件,并写入以下内容:

{
    "clangd.arguments": [
        "--compile-commands-dir=build/Debug",
    ]
}

紧接着我们重启以下 VSCode,进入 main.c,可以看到所有的红色波浪线警告都消失了,甚至在函数参数上有了灰色的形参名提示:

图片

并且无论是函数跳转,变量跳转还是类型跳转,都非常准确!此时我们在试下代码补全:

图片

可以看到这个也没有任何问题。并且在写参数的时候也会立马跳出函数定义时的形参名称提示以及函数说明,非常直观!

图片

现在貌似 clangd 的安装与基本功能都没有问题,不过如果你尝试包含一个 C 库的头文件,你会发现 clangd 还是会提示找不到该文件:

图片

自然,使用这里面的函数也是会出现未定义的警告提示:

图片

这是由于我们的 C 库往往是与编译链在一起而不是存在于我们的项目工程中,因此我们需要单独对其指定。

我们可以在工程根目录下新建一个 .clangd 文件,并在其中写入库头文件所在的目录(注意目录需根据自己环境下的实际目录去写):

CompileFlags:
  Add:
    - -ID:\develop\toolchain\arm\arm-gnu-toolchain-14.3.rel1-mingw-w64-x86_64-arm-none-eabi\arm-none-eabi\include

写入后的目录结构如下:

图片

此时我们再回到 main.c,可以看到头文件能够正确被识别,并且能够跳转:

图片

并且调用其内部的函数也没有任何警告:

图片

至此,clangd 已经能够正常使用,最后我们编译下看看整个项目基于 CMake 能否编译成功,由于安装了 CMake Tools 插件,因此无需手动敲命令,仅需点击 CMake 插件操作界面 Build 条目右侧的按钮即可:

图片

看到 VSCode OUTPUT 窗口显示如下信息表示编译成功:

图片

后续的下载/调试等操作与之前的文章并无差异,感兴趣的小伙伴可以回到本文开头找到链接进入学习。


网站公告

今日签到

点亮在社区的每一天
去签到