为什么 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>
在互联网上搜索错误和关键字 clangd
、clangd config
、clangd .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 服务器,所以这个问题没有直接关系,但恰好有我的解决方案。
问题陈述:
我在自定义位置安装了一个库,编译和链接工作正常,但 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>
在互联网上搜索错误和关键字 clangd
、clangd config
、clangd .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 服务器,所以这个问题没有直接关系,但恰好有我的解决方案。