VSCode配置Clang C/C++开发环境 [+clangd代码静态检查配置]

发布时间 2023-10-21 18:43:17作者: Lee-zq

问题:
gcc/g++是c/c++使用最广泛的编译器,也是linux默认自带的编译套件,但在vscode上,也可通过微软官方提供的C/C++插件很便捷进行c/c++代码编译调试,但是该插件的自动补全和代码提示等功能很差,经常给不出合理的候选项。
另外一套C/C++代码编译套件是基于LLVM的clang/clang++编译器、lldb调试器、clangd语言服务器,使用clangd来实现高效的静态检查、自动补全和代码提示。

硬件环境: VScode SSH远程连接Linux x86服务器

  1. 安装必要软件依赖
    apt install clang clangd lldb cmake
    clang:Clang是一种用于C、C++和Objective-C编程语言的编译器前端。它被设计为一个快速、高效和高度可定制的编译器,提供出色的诊断和错误信息。Clang是LLVM项目的一部分,LLVM是一个模块化和可重用的编译器和工具链技术集合。
    clangd:clangd是一个基于Clang编译器的语言服务器,用于提供C/C++语言的代码补全、语义分析和代码导航等功能。clangd通过解析源代码并构建语法树和语义图来理解代码,并根据用户的输入提供相关的代码建议和信息。它还支持跳转到定义、查找引用、重构等功能,帮助开发人员更高效地编写和维护C/C++代码。
    lldb:lldb是一个开源的调试器,用于调试C、C++、Objective-C和Swift等编程语言的应用程序。它是在LLVM项目的基础上开发的,和GDB功能类似。
    cmake:CMake是一个跨平台的开源构建工具。

  2. 在vscode上安装需要的依赖:
    在安装前卸载之前配置使用gcc调试用的C/C++插件(冲突),然后安装Clangd和CodeLLDB

  3. .vscode/settings.json添加配置:

  // 开启粘贴保存自动格式化
  "editor.formatOnPaste": true,
  "editor.formatOnType": true,
  "C_Cpp.errorSquiggles": "Disabled",
  "C_Cpp.intelliSenseEngineFallback": "Disabled",
  "C_Cpp.intelliSenseEngine": "Disabled",
  "clangd.path": "/usr/bin/clangd",
  // Clangd 运行参数(在终端/命令行输入 clangd --help-list-hidden 可查看更多)
  "clangd.arguments": [
    // compile_commands.json 生成文件夹
    "--compile-commands-dir=${workspaceFolder}/build",
    // 让 Clangd 生成更详细的日志
    "--log=verbose",
    // 输出的 JSON 文件更美观
    "--pretty",
    // 全局补全(输入时弹出的建议将会提供 CMakeLists.txt 里配置的所有文件中可能的符号,会自动补充头文件)
    "--all-scopes-completion",
    // 建议风格:打包(重载函数只会给出一个建议)
    // 相反可以设置为detailed
    "--completion-style=bundled",
    // 跨文件重命名变量
    "--cross-file-rename",
    // 允许补充头文件
    "--header-insertion=iwyu",
    // 输入建议中,已包含头文件的项与还未包含头文件的项会以圆点加以区分
    "--header-insertion-decorators",
    // 在后台自动分析文件(基于 complie_commands,我们用CMake生成)
    "--background-index",
    // 启用 Clang-Tidy 以提供「静态检查」
    "--clang-tidy",
    // Clang-Tidy 静态检查的参数,指出按照哪些规则进行静态检查,详情见「与按照官方文档配置好的 VSCode 相比拥有的优势」
    // 参数后部分的*表示通配符
    // 在参数前加入-,如-modernize-use-trailing-return-type,将会禁用某一规则
    "--clang-tidy-checks=cppcoreguidelines-*,performance-*,bugprone-*,portability-*,modernize-*,google-*",
    // 默认格式化风格: 谷歌开源项目代码指南
    // "--fallback-style=file",
    // 同时开启的任务数量
    "-j=2",
    // pch优化的位置(memory 或 disk,选择memory会增加内存开销,但会提升性能) 推荐在板子上使用disk
    "--pch-storage=disk",
    // 启用这项时,补全函数时,将会给参数提供占位符,键入后按 Tab 可以切换到下一占位符,乃至函数末
    // 我选择禁用
    "--function-arg-placeholders=false",
    // compelie_commands.json 文件的目录位置(相对于工作区,由于 CMake 生成的该文件默认在 build 文件夹中,故设置为 build)
    "--compile-commands-dir=build"
  ],

注意compile-commands-dir项为编译目录,会在这下面生成clangd静态检查依赖编译数据库文件compelie_commands.json
4. cmake构建添加参数:

cd build
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1 .. -G 'Unix Makefiles'

等价于在CMake文件中添加定义set(CMAKE_EXPORT_COMPILE_COMMANDS, 1)

之后,写代码就会自动提示,静态检查也会显示在vscode Problem窗口中;
此外,调试器设置(launch.json)可用clang++、也可用g++。


TIPS:

在Top CMakeLists.txt中设置c\c++编译器时,写在project()之前才会生效,不然还是会找系统默认的编译器,如下:

cmake_minimum_required(VERSION 3.10.1) 

# SET(CMAKE_C_COMPILER "/opt/envs/gcc-9.4.0/bin/gcc")
# SET(CMAKE_CXX_COMPILER "/opt/envs/gcc-9.4.0/bin/g++")
set(CMAKE_C_COMPILER "/usr/bin/clang")
set(CMAKE_CXX_COMPILER "/usr/bin/clang++")

project(infersdk) # 在这行之前设置CMAKE_CXX_COMPILER