系列文章

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

好的工具安装也不是一蹴而就的,下面记录一下安装使用vscode-clangd的艰辛历程

本人系统环境 CentOS Linux release 7.9.2009 (Core)

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

  • 参考官方资料 https://clangd.llvm.org/ faq
  • 下载llvm-project源码包
    wget https://github.com/llvm/llvm-project/releases/download/llvmorg-16.0.6/llvm-project-16.0.6.src.tar.xz
  • 编译参数
    tar -xvf llvm-project-16.0.6.src.tar.xz
    mkdir llvm-project-16.0.6.src/build
    cd llvm-project-16.0.6.src/build
    cmake3 -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local/llvm-16.0.6 -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra" ../llvm
    make install -j $(nproc)
    
  • 编译完成后将/usr/local/llvm-16.0.6/bin添加到PATH环境变量中

配置

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

插件配置

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 文件的方法

  • 如果通过cmake 方式编译项目,3.5+版本中,在CMakeLists.txt工程文件中添加 set(CMAKE_EXPORT_COMPILE_COMMANDS ON),或者cmake添加 -DCMAKE_EXPORT_COMPILE_COMMANDS=ON 参数,make后可以在 build 目录下生成compile_commands.json文件

  • 如果是基于make方式来编译,那么可以先安装pip install compiledb,之后在当前目录下运行

    • compiledb -n make -C build
    • compiledb make -C build

    这两个命令中的其中一个来生成 compile_commands.json 文件,其中前者不会执行真正的 make 编译命令。

  • 如果是基于其他方式,可以使用 https://github.com/rizsotto/Bear 项目中的方式来生成对应的 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 --style=LLVM -i main.cpp对main.cpp源文件进行格式化处理,并改写原文件。
  • clang-format --style=LLVM --dump-config > .clang-formatdump LLVM代码风格的配置文件,可以在此基础上根据需要进行调整,具体各配置项的代表意义可根据官方文档说明来理解。

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

clang-tidy配置

  • 占个坑,待有空真实体验以后再补充

总结

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

  • CMake
  • CMake Tools
  • clangd,其实涵盖了Clang Format以及Clang Tidy功能
  • Doxygen Documentation Generator

技巧

  • Ctrl + Shift + P显示所有命令,查找Preferences: OPen Default Settings (JSON),可以查看默认的配置文件,可以根据需要来定制进行环境的迁移

延伸

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐