首页 > 解决方案 > 如何向 task.json 添加多个包含路径?

问题描述

我正在尝试调试此存储库: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 "Processor/Machine.h"I put #include "/home/user/MP-SPDZ_VSCode/Processor/Machine.h")中时,它会找到标题。但是,存储库很大,无法以这种方式修复它。

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

标签: c++ubuntuvisual-studio-code

解决方案


该文件可能c_cpp_properties.json不是设置include目录的正确位置。根据其参考

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

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

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

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

推荐阅读