【问题标题】:VSCode not recognizing includes from includepathVSCode 无法识别包含路径中的包含
【发布时间】:2019-12-18 20:52:45
【问题描述】:

我遇到了一个问题,VSCode 会识别出我包含的 zipper.h,然后突然转向我并告诉我没有这样的文件或目录。我不确定这是否是我的代码或包含或 vs 代码的问题。

https://i.gyazo.com/2d35a31abf83546d8633d991bcb4752a.png https://i.gyazo.com/96ad7825e8d1c390035a4db2f789bbcf.png

我已经尝试将它添加到我的包含路径和 Windows 环境路径中。由于同样的原因,它一直失败。我对自己做错了什么感到非常困惑。它不识别这些链接吗?编译时是否应该通过 g++ 链接库?

#include <zipper.h>

void zipFolder()
{
    zipper::Zipper zipFile("logs.zip");
    zipFile.add("C:\\Cycling");
    zipFile.close();
}

int main(int argc, char const *argv[])
{
    return 0;
}
c:\Users\Desk\Desktop\Code\Cycling>cd "c:\Users\Desk\Desktop\Code\Cycling\" && g++ test.cpp -o test && "c:\Users\Desk\Desktop\Code\Cycling\"test
test.cpp:1:10: fatal error: zipper.h: No such file or directory
 #include <zipper.h>
          ^~~~~~~~~~
compilation terminated.

【问题讨论】:

  • 如果以下解决方案不适合您,请注意 VScode 不能很好地支持网络文件夹,issue 3402

标签: c++ visual-studio-code zip zipper


【解决方案1】:

您没有告诉编译器有关名为 Zipper.h 的文件或其所在位置或与之相关的任何信息。 “g++ test.cpp -o test”只是告诉编译器编译一个名为 test.cpp 的源文件并链接它。您必须了解 Visual Studio Code 不是 IDE,不能自行编译。您应该在 .vscode 目录中有一个名为 c_cpp_properties.json 的文件。例如,我使用的那个看起来像这样,并且配置为 mingw64。

{
    "configurations": [
        {
            "name": "Win32",
            "includePath": [
                "${workspaceFolder}/Source/**"                
            ],
            "compilerPath": "C:\\mingw-w64\\mingw64\\bin\\gcc.exe",
            "intelliSenseMode": "gcc-x64",
            "browse": {
                "path": [
                    "${workspaceFolder}"
                ],
                "limitSymbolsToIncludedHeaders": true,
                "databaseFilename": ""
            }
        }
    ],
    "version": 4
}

这告诉 Visual Studio Code 你的源文件和库在哪里。这就是用于 IntelliSense(语法高亮、错误曲线、代码完成等)的内容。但是,这与构建您的项目绝对无关。您的编译器现在不知道您在 Visual Studio Code 中设置的包含路径。所以要编译你的项目,你必须告诉你的编译器他需要知道的一切。 Visual Studio Code 只执行您在任务中指定的内容。这与进入该目录并在命令提示符中键入相同的内容相同。因此,我建议您阅读如何使用 g++ 编译 c++ 项目,您的问题与 Visual Studio Code 完全无关。如果您打算做一些比单个源文件更大的事情,我强烈建议您学习 CMake。一旦你有更多的源文件和包含/库要链接,通过手动调用 gcc get 进行编译真的很复杂。设置好 Cmake 后,您只需在 Visual Studio Code 中指定一个与此类似的任务来构建您的项目:

{
    "version": "2.0.0",
    "tasks": [
        {
            "label": "Build",
            "type": "shell",
            "command": "cmake --build Build",
            "group": {
                "kind": "build",
                "isDefault": true
            }
        }
    ]
}

我还建议您阅读以下内容: https://code.visualstudio.com/docs/cpp/config-mingw

这是一个非常好的解释,基本上正是你试图通过 Microsoft 做的事情,并在我开始使用 Visual Studio Code 进行 c++ 工作时帮助我理解这一点。

【讨论】:

  • 您好埃里克,感谢您的帮助和解释。老实说,出于某种原因,我认为这些文件会被 VSCode 以某种方式包含在内。我确实知道 makefile 是如何工作的,而且我只是从来没有在 Windows 中使用过它们,而且老实说,我从来不知道它们是 Windows 中的东西。我对在 Windows 中开发有点陌生,我已经不喜欢它了。我将设置我的树莓派
  • 您所做的并不是真正的 Windows。 VSCode 是一个跨平台的代码编辑器,而 MinGW (g++) 只是 GNU Compiler Collection 的 Windows 端口。因此,在 Windows 上手动构建与在 Linux 上的构建方式几乎相同。例如,使用 MSBuild 构建是非常不同的。
  • 我知道这真的不是 windows 的东西,但我不太习惯 VSCode 或 windows。我通常只使用 vi 并坚持使用它,但是当我切换到 windows 时,我变得非常喜欢它,它有点回来咬我。我会研究 MSBuild 并尝试一下。
  • @SomeSimpleton Settings 的解释 -> Extensions -> C/C++ -> C_Cpp&gt;Default: Include Path 说:The value to use in a configuration if "includePath" is not specified in c_cpp_properties.json. 所以我认为,json 中定义的 includePath 将当然也改变编译器的包含路径?那么我也有同样的问题,编译器没有找到包含的文件,所以我无法证明我的说法:/
【解决方案2】:

Visual Studio Code 不会更改构建命令本身,即使 includePath 发生更改。您应该在.vscode/tasks.json 中自己更改构建命令。见this tutorial

【讨论】:

    【解决方案3】:

    c_cpp_properties.jsonsettings.json 中的"includePath" 属性仅与内部编辑器的IntelliSense 功能相关,与编译无关。 为了告诉编译器必要的包含路径,您需要在构建任务中指定一个对应的编译器选项(在tasks.json),即"-Ipath/to/my/include/files"

    这是来自我的tasks.json 文件的构建任务示例(查看"args" 属性 - 它包含编译器选项"-I${workspaceFolder}/../..",即从当前目录向上两级):

    {
      "version": "2.0.0",
      "tasks": [
        {
          "type": "cppbuild",
          "label": "C/C++: g++-9 build active file ver(1)",
          "command": "/usr/bin/g++-9",
          "args": [
            "-std=c++17",
            "-I${workspaceFolder}/../..",
            "-g",
            "${workspaceFolder}/*.cpp",
            "-o",
            "${fileDirname}/${fileBasenameNoExtension}"
          ],
          "options": {
            "cwd": "${fileDirname}"
          },
          "problemMatcher": [
            "$gcc"
          ],
          "group": {
            "kind": "build",
            "isDefault": true
          },
          "detail": "compiler: /usr/bin/g++-9"
        }
      ]
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-10
      • 2019-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多