为什么 clangd 看不到我的自定义库位置

Why is clangd not seeing my custom library location

问题陈述:

我在自定义位置安装了一个库,编译和链接工作正常,但 clangd 报告与自定义库相关的各种错误。

我的 Makefile 具有以下标志:

CFLAGS += -I/usr/local/share/mylib                             
LDFLAGS += -lmylib -L/usr/local/lib/
...
<snip>

但是,clangd 不知道如何找到 header 文件,因此我的编辑器显示了如下无用的错误:

#include <mylibheader.h>    'mylibheader.h' file not found

mylib_type1_t foo                     unknown type name 'mylib_type1_t'

...
<snip>

在互联网上搜索错误和关键字 clangdclangd configclangd .clang-format 未能在 SO 或其他地方产生任何有用的信息(因此出现这个问题)。

问题是:

如何告诉 clangd 我的 non-standard header 在哪里,这样它就不会显示虚假的“找不到文件”警告?

tl;博士:

将编译标志添加到 compile_flags.txt(小项目)或为更复杂的项目生成 compile_commands.json。请参阅说明 here

示例:我的 compile_flags.txt 包含:

-I/usr/local/share/mylib
-lmylib
-L/usr/local/lib/

我是如何排除故障的?

man 1 clangd 给出了检查输出的有用提示

       --check[=<string>]                 - Parse one file in isolation instead of acting as a language server. Useful to investigate/reproduce crashes or configu‐
              ration problems. With --check=<filename>, attempts to parse a particular file.

clangd --check=src/main.c的部分输出:

E[13:12:40.787] [pp_file_not_found] Line 10: 'mylibheader.h' file not found

E[13:12:40.820] [unknown_typename] Line 187: unknown type name 'mylib_type1_t'
E[13:12:40.820] [unknown_typename] Line 202: unknown type name 'mylib_type1_t'
E[13:12:40.820] [undeclared_var_use] Line 820: use of undeclared identifier 'mylib_type2_t'
...
<snip>

在我的搜索字词中添加 pp_file_not_found 让我找到了这个 very helpful issue*,其中有一条评论说:

Looks like you don't have a compile_flags.txt or compilation_database.json set up. That file tells clangd where to find include files, you can check project setup guide for details.

  • 请注意,我没有使用 coc-neovim,而是使用 Neovim 的内置 lsp 服务器,所以这个问题没有直接关系,但恰好有我的解决方案。