#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», «${имя_файла} /.., …, «$ {имя_файла} / ../Процессор». По-прежнему не удается найти заголовки.