c++ VSCode无法识别包含路径中的包含

kzipqqlq  于 2023-02-26  发布在  Vscode
关注(0)|答案(4)|浏览(374)

我遇到了一个问题,VSCode将识别我的包含zipper.h,然后不知从哪里翻过来告诉我没有这样的文件或目录。我不确定这是我的代码或包含或vs代码的问题。
https://i.gyazo.com/2d35a31abf83546d8633d991bcb4752a.pnghttps://i.gyazo.com/96ad7825e8d1c390035a4db2f789bbcf.png
我试着把它添加到我的include路径和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.
qzwqbdag

qzwqbdag1#

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"
    }
  ]
}
yws3nbqq

yws3nbqq2#

你没有告诉你的编译器任何关于一个叫做Zipper. h的文件或者它的位置,“g++ test.cpp -o test”只是告诉编译器编译一个名为test.cpp的源文件并链接它。您必须了解Visual Studio代码不是IDE,不能自行编译。您应该在.vscode目录中有一个名为c_cpp_properties. json的文件。例如,我使用的那个看起来是这样的,并且是为mingw 64配置的。

{
    "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代码源文件和库的位置。这是用于智能感知的(语法突出显示、错误波形、代码完成、等等)。然而这绝对与构建你的项目无关。你的编译器现在不知道你在Visual Studio代码中设置的包含路径。所以要编译你的项目,你必须告诉你的编译器他需要知道的一切。Visual Studio Code只是执行你在任务中指定的内容,这就像是在你的命令提示中进入那个目录并键入同样的内容一样,所以我建议你阅读一下如何用g编译一个c项目,您的问题与Visual Studio代码完全无关。如果你打算做一些比一个源文件更大的东西,我强烈建议你学习CMake。当你有更多的源文件时,手动调用gcc get编译真的很复杂,包括/库。设置好Cmake后,只需在Visual Studio代码中指定一个与以下任务类似的任务即可生成项目:

{
    "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
这是一个非常好的解释,基本上正是你试图做的微软,并帮助我理解这一点,当我开始使用VisualStudio代码为我的C++工作。

4xrmg8kj

4xrmg8kj3#

Visual Studio代码不会更改生成命令本身,即使includePath更改也是如此。您应该在.vscode/tasks.json中自己更改生成命令。请参见this tutorial

yqkkidmi

yqkkidmi4#

我遇到过同样的问题。在我的例子中,这是c_cpp_properties.json文件中不必要的一行。该行是:"configurationProvider": "ms-vscode.makefile-tools".
由于此行,它尝试从错误创建的Makefile配置包含,忽略c_cpp_properties.json文件中的"includePath"
要解决此问题,请注解掉上面提到的行或充分配置您的Makefile。之后,可能需要重新启动VS代码。还可以尝试暂时隐藏Makefile(例如,在Linux中重命名为.Makefile)。

相关问题