VScode 中 Clangd 使用

VScode 中 Clangd 使用

本人苦于 C/C++ 占用内存良久,于是乎想尝试一下 clangd 所支持的代码跳转及代码补全是否更加高效。

VScode 中 Clangd 优缺点

优点

  1. 占用系统资源确实比 C/C++ 少了很多,无论是 CPU 还是 内存的使用。(最重要)

缺点

  1. 操作相较于 C/C++ 确实也繁琐一点。

总结一下,就是对于大型项目来说,使用 clangd 能够明显降低系统资源的占用,能够减少出现系统卡顿的情况,不过使用门槛较高。C/C++ 更适合小项目的开发,使用起来更加便利,能够更好的进行调试。

VScode 中 Clangd 使用

Linux 下 clangd 安装

操作系统为 ubuntu20.04

官网说明地址: Getting started

在系统的源里面,并被有找到 clangd13 的软件,安装 12 版本需要降级 gcc 。遂采用直接下载可执行的方式进行

拷贝到环境变量所在的路径的方式。

  1. 通过官方 github 官方 13 地址下载 zip 包。解压后,文件夹如下

  1. bin目录下,拷贝至 /usr/local/bin。将 lib 目录下,拷贝至 /usr/local/lib。具体路径可以根据环境变量自由选择。

  2. 检查是否已经安装成功。终端内敲击 clangd --version 出现类似内容,即代表安装成功。

VScode 下 clangd 插件安装

在应用市场中,直接搜索 clangd 安装即可。

clangd 如果没有指定 compile_commands.json 位置,会在工程路径下进行查找,如需单独指定可以添加以下配置项 --compile-commands-dir=${workspaceFolder}/build/

compile_commands.json 文件生成

直接借用了下这位大佬的博客 compile_commands.json 文件生成 随时联系,可以删除。

compile_commands.json 文件能够有效提高一些工具(比如说ccls1, vscode2)的代码跳转、补全等功能。 因此,本文将会说明如何生成 compile_commands.json 文件,特别是使用 makefile 的老工程。

cmake工程

方法1、cmake工程生成 compile_commands.json 文件比较简单,定义 CMAKE_EXPORT_COMPILE_COMMANDS 即可。

cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1

方法2、在CMakeLists.txt中添加 set(CMAKE_EXPORT_COMPILE_COMMANDS ON) 也可以达到上面的效果。

makefile工程

不过很多(旧的)工程都是用 makefile 来编译的,没有现成的选项生成 compile_commands.json 文件。 虽然也可以使用 ctags, gtags 等,但是跳转其实不是很准确。 我们可以通过 Bear 来生成,而且不需要改动代码。 具体Bear的安装这里就不赘述了,按照 官方文档 来即可。 安装之后,执行以下命令即可生成:

bear 编译命令 # 比如说 bear make

也就是在原有编译命令之前加上 bear 即可,一般都是 bear make 。 生成之后我们就可以愉快地享受更精准的跳转和补全了。😊 ✌️

非原编译环境调整

有的时候不同模块使用的编译环境是不同的,但是想在同一开发机上编码? 其中一种方法是远程开发(比如说vscode remote3),另外一种就是使用 docker 。 代码checkout在同一台开发机,不同编译环境对应不同docker镜像,代码以volume挂载。 这样可以避免编译的交叉影响,省去代码的同步以及日后编译机的裁撤。

不过编译环境的库依赖可能会冲突,所以在开发机上需要存放到不同的目录。 因此生成的 compile_commands.json 文件中的路径需要调整。 我们先通过 -o 选项生成一个备份文件:

bear --append -o compile_commands_org.json 编译命令

然后通过 compile_cmds_replace.sh 脚本替换依赖路径。

#!/bin/bash 
sed 's#/usr/local/svcfrm2#/data/dev-deps/XxxMod/svcfrm2#g' compile_commands_org.json > compile_commands.json 
sed -i 's#/usr/local/commlib#/data/dev-deps/XxxMod/commlib#g' compile_commands.json 
# -I单独一行,下一行还是-I 
perl -i -0pe 's/"-I",\s+"-I/"-I/gms' compile_commands.json 
# -I单独一行,下一行是绝对路径 
perl -i -0pe 's/"-I",\s+"\//"-I\//gms' compile_commands.json 
# -I单独一行,下一行是相对路径 
perl -i -0pe 's/"-I",\s+"\./"-I\./gms' compile_commands.json

上面的脚本示例了如何把 XxxMod 依赖的库 svcfrm2commlib 调整为开发机上对应库的路径。

### 配置和使用 Clangd 扩展进行 C/C++ 开发 #### 安装 Clangd 插件 为了在 Visual Studio Code (VSCode) 中启用 Clangd 功能,需先安装对应的插件。通过访问 VSCode 的扩展市场并搜索 `clangd` 来找到官方推荐的版本进行安装[^1]。 #### 设置工作区环境变量 对于特定的工作目录,可以在 `.vscode/settings.json` 文件内定义必要的编译器路径和其他选项。例如: ```json { "C_Cpp.clang_format_fallbackStyle": "{ BasedOnStyle: Google, IndentWidth: 4 }", "clangd.arguments": [ "--background-index", "--completion-style=detailed" ] } ``` 上述配置指定了默认格式化风格以及增强了自动完成特性[^3]。 #### 处理多语言项目 当面对既包含 C 又包含 C++ 源码的情况时,可以通过创建自定义的编译标志文件(如 compile_flags.txt 或者 .clangd 文件),针对不同类型的源文件应用相应的标准。具体做法如下所示: ```plaintext # 这段为C++代码配置 If: PathMatch: [.*\.cpp, .*\.cxx, .*\.cc, .*\.h, .*\.hpp, .*\.hxx] CompileFlags: Add: [-std=c++23] --- # 这段为C代码配置 If: PathMatch: [.*\.c] CompileFlags: Add: [-std=c17] ``` 此方法确保每种编程语言都能遵循各自最新的语法规范[^2]。 #### 解决智能提示冲突 由于内置的 C/C++ 插件可能会干扰到 Clangd 提供的服务,建议禁用前者以获得更好的体验。操作步骤是在全局或当前项目的设置里调整 `"C_Cpp.intelliSenseEngine"` 参数至 `"Disabled"` 值[^4]。 ```json "C_Cpp.intelliSenseEngine": "Disabled" ``` 这样做的目的是防止两个插件之间的相互影响,从而提高编辑效率和服务质量。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值