Visual Studio Code的clangd插件一篇通

一月 03, 2024 [C/C++] #Linux #Shell 与命令行 #obsidian #编译链接

Visual Studio Code的clangd插件一篇通

苦于微软出品的 C/C++ 插件久矣,时不时就会出现代码提示失效,跳转失败的问题。现在火热的Jetbrains公司的Clion以及Vim上的Youcompleteme插件现在都在用clangd,相比于 C/C++扩展,clangd具有全项目索引、代码跳转、变量重命名、更快的代码补全、提示信息、格式化代码等功能,内存占用和资源占用上也更具优势。

clangd插件安装

  1. clangd插件与微软的C/C++相关插件冲突,那么安装之前关闭 Ctrl + Shift + X在扩展商店中搜C/C++禁用已安装的C/C++插件,如C/C++、C/C++ Themes等
  2. 安装clangd插件 Ctrl + Shift + X在扩展商店中搜clangd安装即可
  3. 安装clangd应用,clangd插件是基于clangd命令实现的 Ctrl + Shift +P在命令窗口中搜clangd: Download language server ,vscode自动从https://github.com/clangd/clangd/releases下载最新的clangd包,剩下就是焦灼的等待。

第三步也可以手动下载对应的离线包,如clangd-linux-16.0.2.zip,然后解压后将其bin路径配置到PATH环境变量中,重启vscode即可。

不幸的是一遍遍的安装一遍遍的提示找不到不clangd需要下载安装,手动执行clangd --version出现bin/clangd: /lib64/libc.so.6: version GLIBC_2.18’ not found (required by bin/clangd)`错误提示。

rpm -qf /lib64/libc.so.6查看这个动态库属于glibc-2.17-325.el7_9.x86_64,通过命令strings /lib64/libc.so.6 | egrep ^GLIBC_2查看其兼容的版本号。

CentOS上各种库与工具相对来说版本都很低。那么接下来更新一些工具库来源码编译clangd

源码编译clangd

clangd understands your C++ code and adds smart features to your editor: code completion, compile errors, go-to-definition and more.

clangd is a language server that can work with many editors via a plugin. Here’s Visual Studio Code with the clangd plugin, demonstrating code completion:

clangd is based on the Clang C++ compiler, and is part of the LLVM project.

升级cmake版本

根据llvm源码告警,cmake版本不低于3.20.0

  1. 下载Binary distributions wget https://github.com/Kitware/CMake/releases/download/v3.27.4/cmake-3.27.4-linux-x86_64.tar.gz
  2. 解压 tar -xvf cmake-3.27.4-linux-x86_64.tar.gz
  3. 将cmake的bin目录添加到PATH路径里,如export PATH=/usr/local/cmake-3.27.4-linux-x86_64/bin:$PATH

升级gcc版本

根据cmake告警提示Host GCC version must be at least 7.1, your version is 4.8.5.,gcc版本不低于7.1,这里直接安装使用scl的devtoolset-8工具链

yum install -y centos-release-scl
yum install -y scl-utils-build
yum install -y devtoolset-8-toolchain
scl -l
scl enable devtoolset-8 bash

编译clangd

配置

配置相对来说比较复杂,包括插件配置,工程配置,格式化风格配置等

插件配置

Ctrl + ,切换出配置页面,【工作区】【扩展】【clangd】,也可以在settings.json直接配置,其中clangd.arguments的配置clangd --help即可

// 是否检查插件冲突
"clangd.detectExtensionConflicts": true,
"clangd.path": "clangd",
// 查找的头文件路径,每一项前缀 -I
"clangd.fallbackFlags": [],
"clangd.arguments": [
	// 在后台自动分析文件(基于complie_commands)
    "--background-index",
    // 标记compelie_commands.json文件的目录位置
    // "--compile-commands-dir=build",
    // 同时开启的任务数量
    "-j=12",
    // 全局补全(会自动补充头文件)
    "--all-scopes-completion",
    // 更详细的补全内容
    "--completion-style=detailed",
    // Include what you use
    "--header-insertion=iwyu",
    // pch优化的位置 disk memory
    "--pch-storage=memory",
    "--cross-file-rename",
    "--enable-config",
    // clang-format style to apply by default when no .clang-format file is found
    "--fallback-style=WebKit",
    "--pretty",
    "--clang-tidy",
    "--query-driver=clang++",
]

Project setup

clangd is based on the clang C++ compiler, and understands even complex C++ code. However, you must tell clangd how your project is built (compile flags). A compile_commands.json file can usually be generated by your build system

参考 Project setup官方文档,总结三种生成 compile_commands.json 文件的方法

格式化配置文件

配置默认的格式插件

  1. 选择需要设置格式化插件的文件
  2. 鼠标右键进行点击
  3. 选择 【使用…格式化文档】
  4. 选择 【配置默认格式化程序】
  5. 选择你需要的格式化插件即可,如clangd

也可以参考下列配置

"[cpp]": {
   // 在cpp文件中,编辑器在保存的时候进行格式化
   "editor.formatOnSave": true,
   "editor.formatOnSaveMode": "file"
   // 在cpp文件中,编辑器在打字的时候进行格式化
   "editor.formatOnType": true,
   // 在cpp文件中,编辑器在粘贴的时候进行格式化
   "editor.formatOnPaste": true,
   "editor.defaultFormatter": "llvm-vs-code-extensions.vscode-clangd"
}

clangd根据.clang-format配置文件进行格式化代码,若改配置文件未找到,则使用fallback-style参数指定的风格进行格式化代码。

clang-format工具提供格式化功能,默认提供几个比较流行的代码风格。可以根据官方文档给出主流的代码风格连接进行查看,也可以使用工具进行格式处理查看效果

将配置好的.clang-format文件放在工程目录下即可,不要过多的纠结细节

总结

至此,上乘的C/C++的VSCode开发环境需要的主要依赖的插件

技巧