VScode clangd 找不到我的头文件未找到 `clang(pp_file_not_found)`

yao*_*ohu 4 c visual-studio-code clangd

描述:

\n

我使用clangd作为语言服务器,在 vscode 中使用 CMake 进行 c/c++ 编码。

\n

然而,我遇到了一些烦人的错误,这些错误一直困扰着我。

\n

forehead/include.h\' file not found clang(pp_file_not_found)\n在此输入图像描述

\n

错误再现:

\n

我有一个名为的目录include,如下所示:

\n
.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 CMakeLists.txt\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 forehead\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 include.h\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 graph\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 graph.h\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 list\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 linklist.h\n...\n
Run Code Online (Sandbox Code Playgroud)\n

在 中linklist.h,clangd 工作正常,没有错误或警告,我可以使用以下命令跳转到include.h文件gd

\n
#include <forehead/include.h>\n
Run Code Online (Sandbox Code Playgroud)\n

但是,clangd 中的完全相同的行graph.h不断给我错误:forehead/include.h\' file not found clang(pp_file_not_found),阻止我跳转到该文件,每个关键字或函数都include.h被 clangd 视为错误。

\n

环境:

\n
    \n
  • 操作系统:macOS 文图拉 13.0
  • \n
  • 铿锵:16.0.3
  • \n
  • CMake:3.26.3
  • \n
\n

root/CMakeLists.txt

\n
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)\n
Run Code Online (Sandbox Code Playgroud)\n

vscode/setting.json

\n
  "clangd.path": "/opt/homebrew/opt/llvm/bin/clangd",\n  "clangd.arguments": ["--header-insertion=never"],\n  "clangd.serverCompletionRanking": true,\n
Run Code Online (Sandbox Code Playgroud)\n

期待:

\n

值得一提的是,我可以在 Vim 中导航并.o使用 CMake 成功构建可执行文件。

\n

我厌倦了处理这个烦人的错误,每次我编写新的头文件时,它都会不断弹出。

\n

(顺便说一句:这个 bug 可能会无缘无故地消失,也许是在我下次打开 VSCode 时——但是,故意重新启动 clangd 或重新加载 VSCode 窗口似乎并没有效果。

\n

Dan*_*iel 5

Clangd 的工作原理是部分编译您的文件并解析 AST。对于源文件(.cpp/.c/等),它只是直接编译该文件,这应该没问题。

对于头文件,它不能直接编译它们,所以目前的方法似乎是选择一个应该与您的头文件匹配的源文件。问题是,这是基于启发式的,经常失败,在依赖项或其他地方找到无意义的文件(请参阅https://github.com/clangd/clangd/issues/519https://github.com/clangd/clangd /问题/123)。

如果这是您的问题,您可以通过在 VSCode 上打开“clangd”语言服务器输出并查找如下行来诊断它:

ASTWorker building file e:\your\folder\forehead\include.h version 1 with command inferred from E:\somewhere\else\Include.cpp
Run Code Online (Sandbox Code Playgroud)

这非常烦人,我不认为有一个干净的方法可以解决它..除了可能将您的文件和一些匹配的 .cpp 文件重命名为更独特的东西,比如旁边forehead_include.h有一个相关的?forehead.cpp否则,类似的名称include.h可能会与其他地方的随机文件配对。

编辑:我在尝试包含引号和相对路径时也取得了一些部分成功,例如#include "../forehead/include.h"

  • 我谨对您提供如此详细和全面的解释表示诚挚的谢意。我很高兴地报告,将文件名从“include.h”更改为“forehead.h”已成功解决了该问题,clangd 工具没有检测到任何错误。您的回答非常宝贵,对我的工作做出了重大贡献。再次感谢您做出的无价贡献。 (2认同)