Clangd 无法识别标准标头



这个问题已经被问过并回答了很多次,但似乎没有一个答案适合我。

我一直试图在nvim lsp中设置clangd。我用bear来生成compile_commands.json,但是clangd仍然给我错误,告诉我它找不到标准库头。下面是一个简单的例子:

main.cpp:

#include <iostream>
using namespace std;
int main(){
cout << "hello clangd";
return 0;
}

然后运行:bear -- g++ main.cpp,它编译并创建一个compile_commands.json,内容如下:

[
{
"arguments": [
"/usr/bin/g++",
"-c",
"main.cpp"
],
"directory": "/home/xxx/tmp/hello_clangd",
"file": "/home/xxx/tmp/hello_clangd/main.cpp"
}
]

我还尝试使用cmake标志编译生成compile_commands.json,但我得到同样的问题。我可以得到文件,但是语言服务器仍然不能正常工作。

我已经能够使用clang与vim-pio,所以它似乎没有坏。我错过了什么

编辑:我在ubuntu上btw

我在Pop!_OS 22.04 LTS使用lunarvim 1.2clang+ +/Clangd似乎在寻找最新的可用库,所以它没有解析"11"目录(其中包含"libstdc++"),它解析"12"目录(不包含"libstdc++")

ls /usr/lib/gcc/x86_64-linux-gnu/
11  12

我搜索了我需要的版本。

apt search libstdc++

安装"libstdc++"从apt存储库获取GCC版本12。

apt install libstdc++-12-dev

我用这篇文章来解决这个问题

我自己使用clang++找到了一个解决方案,使用这里的说明。对我来说有效的命令是:

bear -- clang++ -I/usr/include/c++/11 -I/usr/include/x86_64-linux-gnu/c++/11 -L /usr/lib/gcc/x86_64-linux-gnu/11 main.cpp

这对我来说仍然有点困惑,所以我愿意接受更好的解决方案和解释。

最新更新