我曾经使用 VSCode C/C++扩展。这个扩展中有一个功能(在 json 文件中),称为“includePath”,我可以设置标头的路径,因此无需执行 CMake 或 make,我就会从这些中获得标头和代码完成的建议。
现在我已经切换到 neovim 和 clangd 作为代码完成的语言服务器。我进行了大量搜索以在 clangd options 中找到相应的功能,但除了此链接之外我找不到任何其他内容。
既然clangd是一个强大的语言服务器,我想知道它是否没有这样的功能。所以我想知道clangd中是否真的有这样的功能?如果是的话我该如何使用它?
注意:我使用一个名为“coc-clangd”的语言客户端。我不知道这是否重要。
我正在使用 VSCode 1.65.0、clangd 扩展以及最新 LLVM (14.0) 中的 clangd。
这对我来说变得非常唐突。如何关闭此功能?我找不到有关此功能的文档。
谢谢。
我正在尝试使用 c++17(const lambdas) 中的一项功能,而不会出现 clangd 错误。我在网上搜索过,每个答案都告诉我用标志重新编译 clangd 。真的没有别的办法了吗?
编辑:Clangd 不是编译器。它是一个语言服务器,是一个与 IDE 一起使用的程序,它基本上在编译代码之前检查代码是否有错误和警告。请参阅https://clangd.llvm.org。
这个问题已被问过并回答过很多次,但似乎没有一个答案对我有用。
我一直在尝试clangd在 nvim lsp 中进行设置。我使用bear来生成compile_commands.json,但 clangd 仍然给我错误,告诉我它找不到标准库头。这是一个最小的例子:
主要.cpp:
#include <iostream>
using namespace std;
int main(){
cout << "hello clangd";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
然后我运行: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"
}
]
Run Code Online (Sandbox Code Playgroud)
我还尝试使用 cmake 标志进行编译来生成compile_commands.json,但我遇到了同样的问题。我可以获取该文件,但语言服务器仍然无法正常工作。
我已经能够将 clang 与vim-pio 一起使用,所以看起来它没有损坏。我缺少什么。
编辑:顺便说一句,我在 ubuntu 上
我正在开发一个使用 GCC 库 (SFML) 的项目,据我所知,该库不适用于 clang。我使用 COC 和 vim 来完成代码,但对于 C++,它需要 clangd。有没有办法使用 GCC 作为我的编译器,但仍然使用 clangd 语言服务器?
我还听说可能有一种方法可以让 clang 识别 GCC 库/标头,但我一直无法让它正常工作。如果有人能指出我正确的方向,那也会很有帮助。但我已经习惯了 GCC(自从我开始编程 C++ 以来就一直在使用它),所以能够使用 clangd和GCC 会更好。
这可能是不可能的,但我还是想问。我使用 Clangd 作为 VSCode 的自动完成引擎。它工作得很好,但有一个问题。
Clang 的官方 Windows 二进制文件依赖于 MSVC 标准库头。如果未安装 MSVC,Clang 和 Clangd 会抱怨缺少标头。
有一个标志使 Clang 使用 MinGW 的 libstdc++ ( --target=x86_64-w64-windows-gnu),我必须将其包含在compile_commands.json.
这个解决方案有效,但即使没有compile_commands.json.
有没有办法让 Clangd 假设--target=x86_64-w64-windows-gnu没有compile_commands.json?
我目前的文件结构是:
??? common
? ??? example.cc
??? compile_commands.json
??? include
??? common
??? example.hh
Run Code Online (Sandbox Code Playgroud)
example.hh: 留空
example.cc:
??? common
? ??? example.cc
??? compile_commands.json
??? include
??? common
??? example.hh
Run Code Online (Sandbox Code Playgroud)
compile_commands.json:
#include "common/example.hh"
int main() {
return 0;
}
Run Code Online (Sandbox Code Playgroud)
打开example.cc它会产生错误:
'common/example.hh' file not found clang(pp_file_not_found)
Run Code Online (Sandbox Code Playgroud)
我直接运行命令,它工作正常:
[
{
"directory": "/home/user/project",
"file": "/home/user/project/common/example.cc",
"arguments": [
"/usr/bin/clang++",
"-I /home/user/project/include",
"-o example",
"/home/user/project/common/example.cc"
],
"output": "example"
}
]
Run Code Online (Sandbox Code Playgroud)
环境信息:
$ clang++ --version
clang version 10.0.0-4ubuntu1
Target: x86_64-pc-linux-gnu
Thread …Run Code Online (Sandbox Code Playgroud) 我是 clang 工具的新手用户,正在学习 c/c++。
我有一些基于使用其数据结构和构建系统(OpenFOAM)的框架的代码。我在主目录的文件夹中编译了框架的库。这个框架有一堆目录,将所有类的头文件作为符号链接保存在其中。我使用neovim和coc扩展作为客户端,并使用clangd作为语言服务器。
问题是,在我的代码中 clangd 找到了一些头文件,而不是全部。这种行为的原因可能是什么?以及如何修复它或摆脱编辑器中的诊断。
我阅读了 clangd ( ) 提供的帮助clangd --help,结果发现有一个标志--header-insertion=<string>,如果我将其设置<string>为iwyu(for,包括您使用的内容),我可以摆脱这样的警告。根据帮助,我可以通过文件夹config.yaml中的文件~/.config/clangd( linux中的xdg系统)来配置clangd。问题是,我如何编辑这个文件以获得上述标志的效果。我只是将该标志放入文件中,但没有任何改变。基本上我想要的是,要么配置 clangd 以递归方式搜索目录中的头文件,要么如果不可能,则摆脱无法找到的丢失头文件的诊断警告。
我不知道的另一件事是,如何重新启动服务器以重新读取配置。我应该终止当前进程并重新运行它吗?
请随意编辑问题。
更多信息:
我最近开始在 Vim 上编写代码,虽然这并不容易,但这是值得的。我正在努力弄清楚在 KDevelop 或 VSCode 等 IDE 中理所当然的基本事情,尤其是在通过查找引用、自动完成等来浏览代码时。
对我来说幸运的是我找到了 CoC(-clangd 等)。但我收到一个我无法完全理解和调试的错误:
[coc.nvim] Looks like you've configured clangd in coc-settings.json, you should
remove it to use coc-clangd
Run Code Online (Sandbox Code Playgroud)
当然,我在这个文件中配置了 clangd,正是因为 coc-clangd 插件希望我喜欢这个。
我的coc-settings.json:
{
"languageserver":
{
"clangd":
{
"command": "clangd",
"rootPatterns": ["compile_flags.txt",
"compile_commands.json"],
"filetypes":["c",
"cc",
"cpp",
"c++",
"objc",
"objcpp"]
},
"cmake":
{
"command": "cmake-language-server",
"filetypes": ["cmake"],
"rootPatterns": ["build/"],
"initializationOptions":
{
"buildDirectory": "build"
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
自动完成(例如 printf)正常工作。那么这个警告是关于什么的呢?是我的配置错误还是我的设置中遗漏了某些内容?
提前致谢。
编辑:我曾经编辑内部“clangd”字符串,而它应该是这样的:
{
"languageserver":
{
"coc-clangd": <-- This
{
"command": "clangd", …Run Code Online (Sandbox Code Playgroud) 我有两个从同一源(客户端和服务器)构建的可执行文件,并且它们是使用-D CLIENT=0 -D SERVER=1服务器和-D CLIENT=1 -D SERVER=0客户端的编译选项构建的。如果我做类似的事情
if (CLIENT) {
// Client specific code
}
Run Code Online (Sandbox Code Playgroud)
clangd 抱怨 CLIENT 未定义。有没有办法让 clangd 知道这些宏?(代码编译得很好,错误来自clangd,而不是编译器)