Windows Sublime和LSP-Clangd插件:找不到C ++标头

时间:2019-02-17 23:02:34

标签: clang sublimetext3 windows-subsystem-for-linux sublime-text-plugin language-server-protocol

我最近决定要尝试SublimeText 3,我发现它非常简洁,插件支持范围广!我最近发现了这个插件:https://github.com/tomv564/LSP,并且正在Clangd中使用它。但是问题是我尝试时遇到的错误会编译。我采取的步骤很简单:

  1. 安装Sublime:https://download.sublimetext.com/Sublime%20Text%20Build%203176%20x64%20Setup.exe
  2. 为Windows安装https://releases.llvm.org/7.0.1/LLVM-7.0.1-win64.exe的CLang.exe预制二进制文件
  3. 重新启动计算机(因此可以对Windows环境PATH进行新的修改)。
  4. 从Package Control安装LSP
  5. 在命令面板中键入LSP: Enable Language Server Globally
  6. 在随后的窗口中键入clangd,然后按enter启用。
  7. 重新启动Sublime并打开一个C ++文件。

C ++文件本身没有什么特别的,我可以在这里发布以确保零歧义:

#include <bits/stdc++.h>

using namespace std;

int main() {
    int w, s, c, k;
    cin >> w >> s >> c >> k;
    bool valid = false;
    if (k > s)
        valid = true;
    else if (k == s)
    {
        if (w + c < k)
            valid = true;
        else if (w + c == k)
            valid = true;
        else if (w == k && c == k)
            valid = true;
        else if (w + c <= 2 * k)
            valid = true;
    }
    else if (w + c < k)
        valid = true;
    else if (w + c == k && s <= 2 * k)
        valid = true;
    cout << (valid ? "YES" : "NO") << endl;
    return 0;
}

当我通过WSL与clang++ otherside.cpp一起实际运行该文件时,该文件就会生成,但是在Sublime.exe中,我遇到的两个错误是:

    找不到
  • 'bits / stdc ++。h'文件
  • using指令引用隐式定义的名称空间“ std”
    • 使用未声明的标识符'cin'
    • 使用未声明的标识符'cout'
    • 使用未声明的标识符'endl'

我认为可以通过解决“ std”错误来解决这三个嵌套子弹,所以我真的不认为这是错误吗?

'bits / stdc ++。h'是我在参加编程比赛时使用的一个包含物,所以我知道它在工作环境中很糟糕,但仍然存在,而且我知道using namespace std不是“好的做法”,但至少我知道这不是破坏编译的错误。感觉这是一个Clangd问题,但是我知道我过去使用过的带有LSP的IDE,例如Visual Studio和CLion不会报告这两个错误。以前有人解决过这个问题吗?

更新:我实际上花了一些时间通过运行clang++ otherside.cpp用Clang.exe 构建小cpp文件。我得到了指定的预期错误:“严重错误:找不到'bits / stdc ++。h'文件”但是,在WSL上通过clang++ otherside.cpp进行编译可以很好地进行编译。因此,似乎Windows和Linux之间存在差异。

我发现我在Windows上需要C / C ++标头。根据:https://clang.llvm.org/get_started.html,建议使用MSys实用程序或GNUWin32。我希望我可以通过WSL使用C / C ++标头,这有可能吗?

Feb.22.19更新:我试图安装MinGW C和C ++编译器来获取Clang的头文件,但是好像我想让Clang查找那些头文件一样,我将不得不从源代码构建Clang并修改名为initHeaderSearch.cpp。再次,我希望能有更多的解决方案,在其中可以将WSL的C / C ++标头与Clang.exe一起使用。

此外,作为对我的朋友的概念证明,我还在WSL上安装了Sublime,并安装了LSP-Clangd插件,以显示WSL Sublime上没有出现我在Windows上遇到的Clang错误。尽管足够肯定这些错误不会出现在WSL Sublime上,但它提出了一个有趣的观点。也许有一种方法可以在WSL中 start Clangd并将Sublime.exe挂接到那个中?我知道在过去的几年中,WSL取得了长足的发展,其中之一就是AF_UNIX套接字。我对Unix套接字不是最熟悉,是否可以使用它来启动Clangd或与之交互?

1 个答案:

答案 0 :(得分:0)

我已经解决了最初的问题。 要明确:我弄清楚了为什么Clangd找不到c ++头文件。我没有解决如何使用WSL提供的C / C ++标头,也没有解决如何使用unix套接字通过WSL与Clangd进行交互。

我的问题比仅仅缺少stdc++.h还要深。我一般都缺少所有C / C ++标头。有多种获取这些方法的方法,但是我选择的方法是通过“ Visual Studio Build Tools”安装MSVC。我在这里下载了“ Visual Studio Installer”:https://visualstudio.microsoft.com/thank-you-downloading-visual-studio/?sku=BuildTools&rel=15

下载后,我安装了程序并遵循以下两个步骤:

  1. 打开“ Visual Studio安装程序”
  2. 安装“通用Windows平台构建工具”
    • 已检查要安装的可选组件之一是“ Windows 10 SDK(10.0.17763.0)”

在那之后,LSP插件才对我有用。然后,唯一的问题是“ bits / stdc ++。h”,这是有道理的,因为MSVC是非标准的,因此没有MSVC。我只是用谷歌搜索“ GCC stdc ++。h”,然后找到了我找到的第一个,特别是这个: https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/include/precompiled/stdc%2B%2B.h并将其放在名为“ bits”的文件夹中,该文件夹与其余C / C ++标头位于同一位置(对我而言,位于此处:C:\ Program Files(x86)\ Microsoft Visual Studio \ 2017 \ BuildTools \ VC \ Tools \ MSVC \ 14.16.27023 \ include)。

最后一点PS:我确实安装了整个工具链,因为我想看看我是否可以拥有所谓的“ Linux无关”功能。我想要一个轻巧的替代Visual Studio的产品,我可以推荐给那些不以Linux为导向的同行(尽管我不得不承认找到使用WSL C / C ++标头的解决方案是我放弃寻找“独立于Linux的东西”。 ”)。获取C / C ++标头的方式有多种,最主要的是安装Visual Studio或MinGW。安装Visual Studio无法达到使用替代方法的目的,而MinGW实际上需要从源代码构建Clang来包含C / C ++标头位置。 MSVC在这里是理想的选择,因为安装它很简单。该解决方案实际上仅增加了我要重现该问题的步骤,并且完成了该程序包并允许相对容易地设置C / C ++的开发环境。这些步骤是:

  1. 安装Sublime:https://download.sublimetext.com/Sublime%20Text%20Build%203176%20x64%20Setup.exe
  2. 为Windows安装https://releases.llvm.org/7.0.1/LLVM-7.0.1-win64.exe的CLang.exe预制二进制文件
  3. 安装“ Visual Studio生成工具”:https://visualstudio.microsoft.com/thank-you-downloading-visual-studio/?sku=BuildTools&rel=15
  4. 打开“ Visual Studio生成工具”并安装“通用Windows平台生成工具”
  5. 重新启动计算机(因此可以对Windows环境PATH进行新的修改)。
  6. 从Package Control安装LSP
  7. 类型LSP:在命令面板中全局启用语言服务器
  8. 在随后的窗口中键入clangd,然后按Enter键以启用。
  9. 重新启动Sublime并打开一个C ++文件。