clangd使用求助

使用clangd作为c-mode得lsp server,发现在补全时几乎没有什么信息返回;检查了eglot buffer,里面找到错误信息:

[stderr] I[11:01:20.245] Failed to find compilation database for e:\hello\main\main.c
...
[stderr] "C:\\LLVM\\bin\\clang" "-resource-dir=c:\\LLVM\\lib\\clang\\14.0.5" -- "e:\\hello\\main\\main.c"
...
[stderr] I[11:01:22.064] Failed to generate include insertion edits for adding header (FileURI='file:///E:/hello/main/options.h', IncludeHeader='file:///E:/hello/main/options.h') into e:\hello\main\main.c: Header not on include path

这是一段测试代码,所以C文件和H文件都在一个目录下,为啥会找不着呢?我应该是少了什么配置?

clangd刚开始用,不太明白;我的系统:win10,emacs 29.0.50,eglot最新版本;

多谢大家;

Windows 上,我目前使用的是 https://winlibs.com 上下载的 GCC 12.1.0 + LLVM/Clang/LLD/LLDB 14.0.4 + MinGW-w64 10.0.0 (UCRT) 混合包。

设置简单,无需配置 include、lib 环境变量。只需要配置path环境变量

PATH=<解压所在目录>\bin

使用一切正常,lsp-bridge 补全一切正常。比 单独的 MinGW 或 LLVM 好用。
如果之前添加过 C_INCLUDE_PATH 或 CPLUS_INCLUDE_PATH 环境变量,最好删除掉。

这个包确实很好用;我是单独安装的LLVM,可能是需要配置什么,或者与其他的工具链不兼容,eglot反复报错;用这个包就正常了; 多谢;

奇怪,昨天刚装好时确实好了,今天重新打开工程时又不行了,还是报同样的错误:Failed to generate include insertion edits for adding header;。。。 Header not on include path 这句话报的是什么错误呢?从打印看并不是找不到头文件,而是说不在Header Path里面?这个Header Path是在哪里设置呢?

谢谢;

Header Path 无非两种,一种是系统自动搜索的,也就是<>内的。另一种是 User Header Path,也就是 " " 内的。

如果 <> 内的头文件无法补全,很可能是跟个别环境变量冲突有关。比如同时安装了 vs studio ,就可能出现冲突。这个解决方法网上应该能搜到。我目前不使用 vs studio ,所以无法给出实测有效方案。还有可能是因为之前设置过 Include 之类的环境变量,检查一下,清除掉试试。

通常在代码中首次引入 " " 内的 .h 头文件时不会补全,在写代码时也应该不会出错。如果出错也会是在编译阶段。所以应该不需要在写代码时指定 User Header Path。

此外,建议在windows 平台使用emacs 27.2 版本试试,问题可能不会那么多。之前我使用 28.1 也是时不时得会出现一些莫名其妙的错误。现在我退回到 27.2 版本一切稳定正常。