clangd 使用 (在vscode中)

https://cloud.tencent.com/developer/article/2329171
https://blog.csdn.net/qq_22660775/article/details/88690954

头文件报错

如果直接使用clangd, 在一个多目录的项目中, 可能经常会有头文件缺失提示. 有两种解决方法

方法1 使用 Cmake 生成指引文件

compile_commands.jsonclangd等工具用来提高代码跳转、补全功能的文件,在不存在compile_commands.json时,clangd会在分析自定义头文件时报错。对于c++项目,可以采用cmake 或make的方式来构建项目,而cmake和makefile均有对应的生成compile_commands.json文件的方法。

CMAKE_EXPORT_COMPILE_COMMANDS 选项

默认不开启,开启的两种方法:

  1. 在 CMakeLists.txt 中添加
set (CMAKE_EXPORT_COMPILE_COMMANDS ON)
  1. 在命令行中添加选项 -DCMAKE_EXPORT_COMPILE_COMMANDS=on
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=on 其余指令

方法2 设置 fallbackFlags

fallbackFlags 可以设置 include 路径, 因此可以帮助clangd在路径中找到头文件

clangd 中 fallback flag 和 Argument 的区别

他们是两个不同的配置选项,用于不同的目的:

  1. clangd.arguments:

    • 用于传递给 clangd 软件程序的命令行参数。
    • 这些参数可以配置 clangd 的行为,例如指定编译命令目录、启用或禁用特定功能等。
    • 例如:
      {
        "clangd.arguments": [
          "--compile-commands-dir=${workspaceFolder}/build"
        ]
      }
      
  2. clangd.fallbackFlags:

    • 当 clangd 无法找到 compile_commands.json 文件或没有为特定文件找到编译命令时,使用这些备用标志来解析代码。
    • 这些标志通常包括编译选项和包含路径,以确保 clangd 能够正确解析代码。
    • 例如:
      {
        "clangd.fallbackFlags": [
          "-std=c11",
          "-I${workspaceFolder}/include"
        ]
      }
      

总结:

  • clangd.arguments 用于配置 clangd 的整体行为。
  • clangd.fallbackFlags 用于在缺少编译命令时提供备用的编译选项和包含路径。
clangd arguments

clangd 的 arguments 中可以使用多种选项来配置其行为。以下是一些常用的选项:

选项 作用 示例
--compile-commands-dir=<path> 指定 compile_commands.json 文件所在的目录 --compile-commands-dir=${workspaceFolder}/build
--background-index 启用后台索引,以便在编辑代码时自动更新索引 --background-index
--clang-tidy 启用 clang-tidy 检查 --clang-tidy
--clang-tidy-checks=<checks> 指定要启用的 clang-tidy 检查 --clang-tidy-checks=*,-clang-analyzer-*
--completion-style=<style> 设置代码补全的样式,可以是 detailedbundled 或 plain --completion-style=detailed
--header-insertion=<policy> 设置头文件插入策略,可以是 iwyu(Include What You Use)或 never --header-insertion=iwyu
--header-insertion-decorators 启用或禁用头文件插入装饰器 --header-insertion-decorators
--limit-results=<number> 设置代码补全结果的最大数量 --limit-results=100
--log=<level> 设置日志级别,可以是 verboseinfoerror 或 off --log=info
--pch-storage=<mode> 设置预编译头文件的存储模式,可以是 memory 或 disk --pch-storage=memory
{
  "clangd.arguments": [
    "--compile-commands-dir=${workspaceFolder}/build", 
    // 指定 `compile_commands.json` 文件所在的目录,这个文件通常包含了编译相关的命令信息,通过设置该目录,clangd能够依据其找到对应的编译指令配置,有助于更准确地进行代码分析、索引等操作。
    
    "--background-index", 
    // 启用后台索引功能,意味着在你对代码进行编辑操作时,clangd会自动在后台更新索引,这样能及时获取最新的代码结构等信息,提升代码补全、查找引用等功能的准确性和及时性。

    "--clang-tidy",
     // 开启clang-tidy检查,clang-tidy是用于进行代码静态分析、检查代码规范和潜在问题的工具,启用它可以帮助发现代码中的一些风格问题、潜在错误等,提高代码质量。
     
    "--clang-tidy-checks=*,-clang-analyzer-*", 
    // 指定要启用的clang-tidy检查项目,此处的配置表示启用所有的检查(`*`表示全部),但排除以 `clang-analyzer-` 开头的那些检查,通过这样的设置可以灵活控制具体检查的范围,聚焦于实际关注的代码检查点。
    
    "--completion-style=detailed",
     // 设置代码补全的样式为 `detailed`,也就是补全时会提供更详细的信息,例如包含参数提示、函数返回值等更丰富的内容,方便开发者选择合适的补全项。
     
    "--header-insertion=iwyu", 
    // 设置头文件插入策略为 `iwyu`(Include What You Use),该策略会根据代码实际使用的情况智能地插入所需的头文件,避免不必要的头文件包含,优化代码结构和编译效率。

    "--limit-results=100", 
    // 限定代码补全结果的最大数量为100,防止补全结果过多导致难以选择,可在一定程度上提升补全操作的效率和体验。
    
    "--log=info", 
    // 设置日志级别为 `info`,意味着clangd会记录并输出一般的信息性日志,方便开发者在出现问题时查看相关的运行情况、排查错误,同时又不会像 `verbose` 级别那样输出过多冗余信息。
    
    "--pch-storage=memory", 
    // 设置预编译头文件的存储模式为 `memory`,即将预编译头文件存储在内存中,相较于存储在磁盘等其他方式,在某些场景下可以加快读取速度,提升编译过程中的性能表现。
  ]
}

这些选项可以根据你的需求进行调整,以优化 clangd 的行为和性能。

clangd 在 vscode 和 WSL 中使用

使用远程设置为 WSL 环境 设置路径

vscode 设置了一些 settings.json, 其中含有很多路径, 比如 clangd.exe 路径
当连接到 WSL 中这些路径是无效的, 因为变到了 Linux 环境.
就要用到 远程设置

在这里修改的设置是专门为 WSL 使用的, 它会继承全局设置条目, 并覆盖掉重复的全局设置条目.
因此只要设置clangd相关路径和其他软件路径即可, 至于 "clangd. arguments" 将会继承自 全局设置条目, 例子如下.

{
// 远程设置 settings.json
	"clangd.path": "/usr/bin/clangd",
	"cmake.cmakePath": "/usr/bin/cmake",
	"cmake.options.statusBarVisibility": "compact",
}
posted @ 2025-02-25 17:09  Ace233  阅读(4473)  评论(0)    收藏  举报