【问题标题】:How to add multiple include path to task.json?如何向 task.json 添加多个包含路径?
【发布时间】:2021-02-19 02:36:47
【问题描述】:

我正在尝试调试此存储库:MP-SPDZ,其中许多.h.hpp.cpp 文件放置在不同的文件夹中。此外,在每个.cpp 文件中,都包含几个头文件。

这里更清楚的是文件树的样子:

  >ProjectTP
      >Machines
          -mascot-party.cpp
          -SPDZ.cpp
          -SPDZ.hpp
          -Player-Online.cpp
          -Player-Online.hpp
          -more files ...
      >Processor
          -Machine.h
          -Machine.hpp
          -more files ...
      >More folders ...

请注意,在某些情况下,.hpp 文件被视为.h 文件,而在其他一些情况下,它们被视为.cpp 文件。问题是当我尝试编译项目时,VS Code 找不到标头,而我将所有包含路径添加到 task.json

这是我的主要.cpp 文件(mascot-party.cpp),它位于根目录中名为Machines 的文件夹中。

#include "Player-Online.hpp"
#include "Math/gfp.hpp"
#include "GC/TinierSecret.h"

int main(int argc, const char** argv)
{
    ez::ezOptionParser opt;
    return spdz_main<Share<gfp>, Share<gf2n>>(argc, argv, opt);
}

这是Player-Online.hpp 包含在(mascot-party.cpp) 中(只是为了显示存储库的嵌套程度)

#include "Processor/Machine.h"
#include "Processor/OnlineOptions.h"
#include "Math/Setup.h"
#include "Protocols/Share.h"
#include "Tools/ezOptionParser.h"
#include "Networking/Server.h"

#include <iostream>
#include <map>
#include <string>
#include <stdio.h>
using namespace std;

template<class T, class U>
int spdz_main(int argc, const char** argv, ez::ezOptionParser& opt, bool live_prep_default = true)

...
    return 0;
}

这是我的task.json

{
    "version": "2.0.0",
    "tasks": [
        {
            "type": "shell",
            "label": "C/C++: g++ build active file",
            "command": "/usr/bin/g++",
            "args": [
                "-g",
                "${workspaceFolder}/Machines/mascot-party.cpp",
                //"${workspaceFolder}/Machines/SPDZ.cpp",
                "${workspaceFolder}/Tools/*.cpp",
                "${workspaceFolder}/Math/*.cpp",
                "${workspaceFolder}/OT/*.cpp",
                "${workspaceFolder}/Networking/*.cpp",
                "${workspaceFolder}/Processor/*.cpp",
                "${workspaceFolder}/Protocols/*.cpp",

                "${workspaceFolder}/Machines/*.hpp",
                "${workspaceFolder}/Tools/*.hpp",
                "${workspaceFolder}/Math/*.hpp",
                "${workspaceFolder}/OT/*.hpp",
                "${workspaceFolder}/Processor/*.hpp",
                "${workspaceFolder}/Protocols/*.hpp",

                "-Idir",
                "${workspaceFolder}/Processor",
                "${workspaceFolder}/Tools",
                "${workspaceFolder}/Math",
                "${workspaceFolder}/OT",
                "${workspaceFolder}/Networking",
            
                
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}",
            ],
            "options": {
                "cwd": "${workspaceFolder}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "compiler: /usr/bin/g++"
        }
    ]
}

还有我的c_cpp_properties.json

{
    "configurations": [
        {
            "name": "Linux",
            "includePath": [
                "${workspaceFolder}/**"
            ],
            "defines": [],
            "compilerPath": "/usr/bin/g++",
            "cStandard": "c11",
            "cppStandard": "c++17",
            "intelliSenseMode": "gcc-x64"
        }
    ],
    "version": 4
}

这是编译器错误:

重要提示:当我将绝对路径放入我的 .cpp 文件(例如,我放入 #include "/home/user/MP-SPDZ_VSCode/Processor/Machine.h" 而不是 #include "/home/user/MP-SPDZ_VSCode/Processor/Machine.h")时,它会找到标题。但是,存储库很大,无法通过这种方式修复它。

我尝试了很多不同的配置这么久,但没有结果。任何帮助表示赞赏。谢谢。

【问题讨论】:

    标签: c++ ubuntu visual-studio-code


    【解决方案1】:

    文件c_cpp_properties.json 可能不是设置include 目录的正确位置。根据its reference

    includePath 包含路径是包含头文件的文件夹 (例如 #include "myHeaderFile.h")包含在源中 文件。指定 IntelliSense 引擎使用的路径列表,而 搜索包含的头文件。

    所以很可能这只是用于智能感知。

    在我看来,最安全的选择是在编译器命令中指定包含路径,您已经在 task.json 中手动设置了这些路径。在属性args 中尝试添加参数-Idir,然后添加包含目录Processor 的目录的路径:

    "args": [
        ...
        "-Idir",
        "${fileDirname}/../dir-that-contains-the-Processor-dir
        ...
    ]
    

    【讨论】:

    • @Lyubomir Vasilev 谢谢。我在 task.json 的包含路径之前添加了标志“Idir”。但是,错误是相同的。 "-Idir", "${fileDirname}/*.h", ... , "${fileDirname}/../Processor/*.h",
    • 你需要指定一个目录,而不是像*.h这样的文件。尝试简单地使用 "${fileDirname}/.." 之类的东西 - 这似乎是目录 Processor 所在的位置。
    • @Lyubomir Vasilev,嗯,对。我删除了 * .h 并且只通过了:“-Idir”、“${fileDirname}/..、...、“${fileDirname}/../Processor”。仍然找不到标题。
    猜你喜欢
    • 2015-02-03
    • 2022-01-15
    • 1970-01-01
    • 2017-05-19
    相关资源
    最近更新 更多