我是 clang 工具的新手,正在学习 c/c++。
我有一些基于使用其数据结构和构建系统的框架的代码(OpenFOAM)。我在主目录的文件夹中编译了框架的库。这个框架有一堆目录,将所有类的头文件作为符号链接保存在其中。我使用 neovim 和 coc 扩展作为客户端,并使用 clangd 作为语言服务器。
问题是,在我的代码中,clangd 找到了一些头文件,而不是全部。这种行为的原因可能是什么?以及如何修复它或摆脱编辑器中的诊断。
我阅读了 clangd (
clangd --help
) 提供的帮助,结果发现有一个标志 --header-insertion=<string>
,如果我将 <string>
设置为 iwyu
(用于包含您使用的内容),我可以摆脱它像这样的警告。根据帮助,我可以通过config.yaml
文件夹(linux中的xdg系统)中的
~/.config/clangd
文件来配置clangd。问题是,我如何编辑这个文件以获得上述标志的效果。我只是将该标志放入文件中,但没有任何改变。基本上我想要的是,配置 clangd 以递归方式搜索目录中的头文件,或者如果不可能,则摆脱找不到的丢失头文件的诊断警告。
我不知道的另一件事是,如何重新启动服务器以重新读取配置。我应该终止当前进程并重新运行它吗?
请随意编辑问题。
更多信息:
正如我所说,我正在从事的项目不使用 CMake 作为其主要构建系统。
(据我所知)有两种方法可以修复它。
bear
实用程序生成compile_commands.json
文件。您必须提供一个构建命令,我相信它会解析该构建系统的输出以生成文件。
# bear -- <build command>
# In my case
bear -- wmake
在项目根目录手动创建一个
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
在项目的根目录下创建一个本地 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]
可能的解决方案是: 将 -DCMAKE_EXPORT_COMPILE_COMMANDS=1 添加到 cmake 命令行 例如:cmake -D CMAKE_CXX_COMPILER=clang++ -DCMAKE_EXPORT_COMPILE_COMMANDS=1 .
然后,它会生成一个compile_commands.json文件,该文件可以被clangd自动读取。我没有看到更多关于标题的警告