c++ 在包含的文件中使用clangd

h6my8fg2  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(139)

我正在使用Neovim与lsp-zero插件。下面的最小示例模拟了我在一个大型代码库中遇到的情况。#include语句用于在整个代码库中重复的片段,每个应用程序在main函数中都有几十个这样的文件。
档案defs.h

a = 1;
b = 2;

字符串
文件app.cpp

#include <iostream>

int main (int argc, char *argv[]) {
    int a, b;
#include "defs.h"
    std::cout << a + b << std::endl;
    return 0;
}


LSP功能在app.cpp中有效,但在defs.h中无效。是否有方法在包含的文件中获得一些LSP功能?理想情况下,我希望它能够正确处理编译错误,就像文件包含在app.cpp中一样,并且能够导航到每个变量的声明。

注意事项

运行时,LspInfo我注意到默认情况下clangd在单文件模式下运行。我尝试定义.clangdcompile_commands.json,但到目前为止没有成功,例如使用bear我做到了

bear -- g++ a.cpp


但是defs.h仍然没有LSP功能。

w8ntj3qf

w8ntj3qf1#

Clangd目前不支持非自包含的文件。
在clangd问题跟踪器中有一个开放的bug:https://github.com/clangd/clangd/issues/45

rbl8hiat

rbl8hiat2#

我想提出一些建议,以尝试在您的情况下:有一些方法可以在Neovim设置中使用lsp-zero在包含的文件(如defs. h)中实现LSP功能:
创建一个.clangd文件:在项目的根目录中,创建一个包含以下内容的.clangd文件:

{
"compile_commands": "${workspaceFolder}/build/compile_commands.json"
}

字符串
生成编译数据库:使用一个可以生成编译数据库的构建系统(例如,CMake中的-DCMAKE_EXPORT_COMPILE_COMMANDS=ON)。配置lsp-zero:在Neovim配置中,将compile_commands选项添加到clangd设置中:

require('lspconfig').clangd.setup({
...
capabilities = require('lsp-zero').capabilities(),
cmd = { 'clangd', '--background-index' },
compile_commands = "build/compile_commands.json",
})


也许使用替代语言服务器,如Bear,可在(https://github.com/rizsotto/Bear)获得。他是为多文件项目和头解析而设计的,可能为您的用例提供更好的支持。
另一种方法是使用Clangd扩展,如clangd-extensions,以潜在地改进头处理。
我希望这对你有帮助,并随时提出更多与此案有关的问题。

相关问题