Как добавить несколько путей включения в task.json?

#c #ubuntu #visual-studio-code

#c #ubuntu #visual-studio-code

Вопрос:

Я пытаюсь отладить этот репозиторий: 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::ezOptionParseramp; 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" ), он находит заголовки. Однако репозиторий огромен, и это невозможно исправить таким образом.

Я так долго пробовал много разных конфигураций, но безрезультатно. Любая помощь приветствуется. Спасибо.

Ответ №1:

Вполне возможно, что файл c_cpp_properties.json не является правильным местом для установки ваших include каталогов. Согласно его ссылке:

includePath Путь включения — это папка, содержащая заголовочные файлы (например, #include "myHeaderFile.h" ), которые включены в исходный файл. Укажите список путей, которые механизм IntelliSense будет использовать при поиске включенных файлов заголовков.

Так что, скорее всего, это используется только для intellisense.

На мой взгляд, безопаснее всего указать пути включения в команде компилятора, которую вы уже настраиваете вручную task.json . В свойстве args попробуйте добавить аргумент -Idir , а затем путь к каталогу, который содержит каталог Processor :

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

Комментарии:

1. @ Любомир Василев Спасибо. Я добавил флаг «Idir» перед путями включения в task.json. Однако ошибка та же. «-Idir», «${fileDirname}/*.h», … , «${fileDirname}/../Processor/*.h»,

2. Вам нужно указать каталог, а не файл, подобный *.h . Попробуйте использовать просто что-то вроде "${fileDirname}/.." — похоже, именно здесь Processor находится каталог.

3. @ Любомир Василев, Ах да. Я удалил * .h и передал только: «-Idir», «${имя_файла} /.., …, «$ {имя_файла} / ../Процессор». По-прежнему не удается найти заголовки.