一、vscode 环境准备

自行搜索安装vsocode,windows平台或者Mac平台。个人一般在windows安装vscode,通过vscode官方插件remote ssh 远程到linux平台开发,本文也主要介绍window下远程linux时clangd的使用,为自己做个记录。

二、linux环境下准备

在linux下安装clang,lldb,llvm,clangd

apt install clang-14
apt install llvm-14
apt install lldb-14
apt install clangd-14
#xxx-14,是选择clang llvm 的版本为14,ubuntu下也可以不带-14,使用默认版本.
#ubuntu22.04的默认版本就是14
#请自行搜索clang llvm lldb clangd的作用;
#主要使用的clangd,作为lsb后端解析代码,实现跳转,补全等功能

三、window下环境准备

vsocde安装clangd插件及常用的插件。根据需要按住插件。

四、clangd配置

clangd配置分为用户配置和工作区配置和插件配置。

插件配置:就是在vscode的用户配置或者工作区配置中修改的插件配置。贴一下.vscode下setting.json文件中的clangd插件配置。:

{
    "terminal.integrated.defaultLocation": "editor",
    "clangd.path": "/usr/bin/clangd",
    "C_Cpp.intelliSenseEngine": "disabled",
    "workbench.editor.enablePreview": false,


    "clangd.arguments": [
        "--background-index",
        "--compile-commands-dir=${workspaceFolder}/.vscode",
        "-j=4",
        "--query-driver=/usr/bin/clang++",
        "--clang-tidy",
        "--clang-tidy-checks=performance-*,bugprone-*",
        "--all-scopes-completion",
        "--completion-style=detailed",
        "--header-insertion=iwyu",
        "--pch-storage=disk",
    ],

}

此时须指定compile_commands.json文件的路径,"--compile-commands-dir=${workspaceFolder}/.vscode",用来指定compile_commands.json所在的路径。下面回说明compile_commands.json的文件是什么。

注意:clangd.arguments这个是vscode在clangd启动时,传递给clangd的参数。作用于clangd启动时的行为,不作用在代码层。然后下面的用户配置和项目配置是作用于代码的,控制代码的跳转、警告的一些行为的。同时clangd.arguments也是对全局配置和项目配置的一个补充 。优先级:clangd.arguments>项目.clangd >用户全局配置。

用户配置:是全局配置,一般位于用户的配置文件下,下面是不同平台的配置目录

Windows:C:\Users\XXXX\AppData\Local\clangd\config.yaml

macOS::~/Library/Preferences/clangd/config.yaml

Linux :~/.config/clangd/config.yaml

项目配置:项目的配置文件位于当前工作目录下,名称为.clangd。这个文件只影响当前的项目

注意:用户配置和项目配置的文件都是YAML语法的,注意缩进和符合。

常用配置如下:

If:                               # 设置配置文件的使用条件
  PathMatch: .*\.h                # 所有头文件都使用
  PathExclude: include/llvm-c/.*  # 排除该路径下的所有文件

CompileFlags:            # 编译标志部分
  Add:
    - "-Wall"           # 启用所有警告
    - "-Wextra"         # 启用额外警告
    - "-std=c++20"      # 使用C++20标准
    - "-Iinclude"       # 包含头文件, 相对路径
    - "-isystemF:/include" # 包含头文件, 绝对路径

  Remove: ["-Werror"]   # 移除将所有警告作为错误的选项
  Compiler: clang++     # 指定编译器

Index:
  Background: true            # 在后台索引项目代码
  BuildSystem: "CMake"        # 指定构建系统类型
  IndexFile: ".clangd-index"  # 索引文件路径
  ImplicitDynamic: true       # 动态索引所有头文件
  ResourceDir: "/path/to/resource"  # 资源目录路径

Diagnostics:             # 诊断设置部分
  ClangTidy:             # Clang-Tidy 配置
    Add: ["cppcoreguidelines-*", "modernize-*", "performance-*"] 
    # 添加Clang-Tidy检查项, 其含义参见https://clang.llvm.org/extra/clang-tidy/
    Remove: ["clang-analyzer-*"] # 移除Clang分析器检查项
  ClangTidyChecks: true  # 启用 Clang-Tidy 检查
  Options:               # Clang-Tidy 的选项设置
    UseChecks: ["*"]     # 使用所有检查项
    HeaderFilterRegex: ".*" # 正则表达式,用于过滤头文件
    WarningsAsErrors: "cppcoreguidelines-*" # 将特定警告视为错误

InlayHints:              # 代码提示设置部分
  Enabled: true          # 启用代码提示
  ParameterNames: true   # 显示参数名称提示
  DeducedTypes: true     # 显示推断类型提示
  Designators: true      # 显示设计器提示

Completion:              # 代码补全设置部分
  AllScopes: true        # 启用所有作用域的代码补全
  Brackets: "[]"         # 补全时使用的括号类型

SemanticTokens:          # 语义标记设置部分
  Enabled: true          # 启用语义标记
  DisabledKinds: ["Macro"] # 禁用宏语义标记
  DisabledModifiers: ["Static"] # 禁用静态修饰符语义标记


#.clangd 是 clangd 语言服务器的核心配置文件,用于 项目级或用户级的代码分析行为定制,主要功能包括:
#1、编译参数:指定头文件路径、宏定义、C++ 标准等(替代 compile_commands.json)。
#2、诊断控制:禁用特定警告或错误,调整第三方库的警告范围。
#3、补全优化:过滤无关建议或调整补全优先级。
#4、索引配置:控制符号索引的范围和性能优化。
#5、格式化风格:集成 clang-format 规则(如缩进、括号风格)。

五、生成compile_commands.json

CMake管理的工程,有2中方式生成compile_commands.json

  • 直接修改CMakeLists.txt文件,在文中添加:
set (CMAKE_EXPORT_COMPILE_COMMANDS ON)
  • 执行cmake时候,添加生成compile_commands.json的参数
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=on

Makefile的工程

安装bear

sudo apt install   bear

生成compile_commands.json

bear make 
#bear -- make  不同版本可能命令不同

六、其他

clangd.fallbackFlags 是 编辑器插件(如 VS Code)中配置 clangd 的选项。当 clangd 无法自动获取编译命令(例如项目没有 compile_commands.json,且未配置 .clangd 文件中的 CompileFlags)时,fallbackFlags 会作为默认参数传递给 clangd,帮助它正确解析代码(如头文件路径、宏定义、C++ 标准等)。

setting.json中添加配置

{
  "clangd.fallbackFlags": [
    "-I/usr/local/include",   // 指定头文件路径
    "-I${workspaceFolder}/include",  // 使用变量指向项目内的头文件
    "-DDEBUG",                // 定义宏
    "-std=c++17",             // 指定 C++ 标准
    "-Wall",                  // 启用所有警告
    "-Wno-unused-variable"    // 忽略特定警告
  ]
}

关键注意事项 

  • 如果项目存在 compile_commands.json 或 .clangd 中的 CompileFlags,fallbackFlags 会被忽略。仅在 clangd 无法获取其他编译信息时生效。
  • 编辑器插件专属配置,fallbackFlags 是编辑器插件(如 VS Code 的 clangd 扩展)的配置项,不是 clangd 的原生配置。
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐