最初入门VSCode写C程序的时候,各种教程推荐我们安装C/C++ Extension,然后在.vscode/c_cpp_configurations.json
里书写编译命令,这对于写Hello World等简单的应用程序而言是再方便不过的了。
然而随着编程级别的不断深入,接触到的目录结构越来越复杂,需要一套编译框架来帮助我们编译整个工程。Makefile/Cmake
应运而生。在大型项目结构下(例如:Linux Kernel),.vscode/c_cpp_configurations.json
的代码提示功能逐渐捉襟见肘:你会看到各种代码飙红,跳转失灵/失败现象。
Clangd
能够很好地解决这一问题。在我理解来看,Clangd
会将项目编译的整个过程索引下来,建立起代码跳转结构,从而基本做到0延迟0错误的跳转
相关配置教程已经有很多了,以下是博主的参考
这里值得说明的是两个问题:
clangd
版本必须大于11代码才能够高亮,参考这里。Ubuntu一般来说会提供许多clangd
版本供选择,下载正确版本(例如:clangd-12)。ctrl + shift + p
打开设置,在拓展中找到clangd
,下拉找到Path,修改为对应Clangd
的路径即可。值得说明的是,如果系统默认的Clangd
版本已经大于11了,那么这一步可以忽略。Clangd
搜索--compile_commands-dir
路径下的compile_commands.json
文件来建立索引结构,compile_commands.json
指明了该工程的编译方式。下面是--compile_commands-dir
配置的一个例子。
生成compile_commands.json
的方式主要有两种,可以参考博主上一篇博客。
接下来用两个Linux开发例子展示Clangd
的强大之处。
很久以前博主写过这样一篇博客:用VSCode进行Linux内核模块开发的BUG解决方案。这里面讲述了如何通过配置.vscode/c_cpp_configurations.json
来避免VSCode的错误提示。
使用Clangd
后,在模块目录下(确保你有正确的Makefile)直接运行
make clean && bear make
即可生成compile_commands.json
,重新加载一下窗口就能进行任意跳转。
Linux内核目录结构极为复杂,每个目录都有自己的Makefile。社区提供了一个脚本来生成compile_commands.json
。
需要注意的是,在运行该脚本前,需要config并编译内核,这样脚本才能生成对应的编译命令。流程如下
# 生成.config
make menuconfig
# 最大核心编译内核
make -j$(nproc)
# 生成compile_commands.json
python3 ./scripts/clang-tools/gen_compile_commands.py
等待Clangd
自动构建索引,然后就能丝滑跳转。
随着开发结构愈发复杂,.vscode/c_cpp_configurations.json
无法很好地进行代码跳转任务。本文介绍了如何通过Clangd
进行更丝滑开发的办法。掌握这一点,我们就可以