如何配置 clangd 来查找丢失的外部头文件?

Ali*_*Ali 7 config clang neovim clangd coc.nvim

我是 clang 工具的新手用户,正在学习 c/c++。


我有一些基于使用其数据结构和构建系统(OpenFOAM)的框架的代码。我在主目录的文件夹中编译了框架的库。这个框架有一堆目录,将所有类的头文件作为符号链接保存在其中。我使用neovim和coc扩展作为客户端,并使用clangd作为语言服务器。

问题是,在我的代码中 clangd 找到了一些头文件,而不是全部。这种行为的原因可能是什么?以及如何修复它或摆脱编辑器中的诊断。

我阅读了 clangd ( ) 提供的帮助clangd --help,结果发现有一个标志--header-insertion=<string>,如果我将其设置<string>为iwyu(for,包括您使用的内容),我可以摆脱这样的警告。根据帮助,我可以通过文件夹config.yaml中的文件~/.config/clangd( linux中的xdg系统)来配置clangd。问题是,我如何编辑这个文件以获得上述标志的效果。我只是将该标志放入文件中,但没有任何改变。基本上我想要的是,要么配置 clangd 以递归方式搜索目录中的头文件,要么如果不可能,则摆脱无法找到的丢失头文件的诊断警告。

我不知道的另一件事是,如何重新启动服务器以重新读取配置。我应该终止当前进程并重新运行它吗?


请随意编辑问题。

更多信息:

  • 操作系统:artixlinux
  • NVIM:v0.5.0-dev+1225-gbbdd00203
  • CLANGD:v11.1.0

Ali*_*Ali 5

正如我所说,我正在从事的项目不使用 CMake 作为其主要构建系统。

(据我所知)有两种方法可以解决这个问题。

  1. bear生成文件的实用程序compile_commands.json。您必须提供一个构建命令,我相信它会解析该构建系统的输出以生成文件。

    # bear -- <build command>
    
    # In my case
    bear -- wmake
    
    Run Code Online (Sandbox Code Playgroud)
  2. compile_flags.txt手动在项目的根目录创建一个文件,并添加所有必要的标志,包括包含头文件的目录的路径-I

    -std=c++14
    -m64
    -g
    -IlnInclude
    -I/Volumes/OpenFOAM/OpenFOAM-v2206/src/OpenFOAM/lnInclude
    -I/Volumes/OpenFOAM/OpenFOAM-v2206/src/OSspecific/POSIX/lnInclude
    -fPIC
    -I/opt/homebrew/include
    -I/Volumes/OpenFOAM/OpenFOAM-v2206/src/atmosphericModels/lnInclude
    -I/Volumes/OpenFOAM/OpenFOAM-v2206/src/fvOptions/lnInclude
    -I/Volumes/OpenFOAM/OpenFOAM-v2206/src/renumber/renumberMethods/lnInclude
    -I/Volumes/OpenFOAM/OpenFOAM-v2206/src/mesh/extrudeModel/lnInclude
    -I/Volumes/OpenFOAM/OpenFOAM-v2206/src/mesh/snappyHexMesh/lnInclude
    -I/Volumes/OpenFOAM/OpenFOAM-v2206/src/mesh/blockMesh/lnInclude
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在项目的根目录下创建一个本地clangd 配置文件( ),其中包含以下内容(添加您需要的任何编译器标志):.clangd

    If:
      PathMatch: .*\.cpp
    
    CompileFlags:
      Add: [-std=c++20, -Wall, -Wextra,  -I/Volumes/OpenFOAM/OpenFOAM-v2206/src/OpenFOAM/lnInclude]
    
    ---
    
    If:
      PathMatch: .*\.c
    
    CompileFlags:
      Add: [-std=c2x, -Wall, -Wextra,  -I/Volumes/OpenFOAM/OpenFOAM-v2206/src/OpenFOAM/lnInclude]
    
    
    Run Code Online (Sandbox Code Playgroud)