Включение файлов из разных папок C++ VS code
При разделении кода на файлы и папки столкнулся с проблемой включения .cpp и .h файлов.
Есть дерево файлов:
1 String (папка проекта)
1.1 .vscode (папка vs code)
1.1.1 settings.json
1.1.2 tasks.json
1.2 headers (папка с заголовочными файлами)
1.2.1 String.h
1.3 sourse (папка с файлами ресурсов)
1.4 main.cpp (файл захода в программу)
в String.h находится объявление класса String, а в String.cpp его реализация. В main.cpp вызывается класс String и пара его методов через вызов заголовочного файла.
main.cpp
#include"headers/String.h"
int main()
{
String str("lorem");
str.Print();
return 0;
}
String.h
#pragma once
class String
{
private:
char* str;
public:
String();
~String();
void Print();
//...
}
String.cpp
#include<String\headers\String.h>
#include<iostream>
String::String(){
//...
}
String::~String(){
//...
}
void String::Print(){
//...
}
и пришлось добавить в tasks.json аргумент String.cpp чтобы компилятор его увидел.
tasks.json
{
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: g++.exe сборка активного файла",
"command": "C:\\msys64\\mingw64\\bin\\g++.exe",
"args": [
"-fdiagnostics-color=always",
"-g",
"${file}","${fileDirname}\\source\\String.cpp",//здесь
"-I",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "Задача создана отладчиком."
}
],
"version": "2.0.0"
}
и в итоге возникает ошибка в String.cpp
fatal error: String\headers\String.h: No such file or directory
2 | #include"String\headers\String.h"
| ^~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
Я честно говоря не понимаю почему так происходит и возможно ошибка намного проще чем мне кажется.
Заранее спасибо за ответ!
Ответы (1 шт):
В проекте нет пути "String\headers\String.h". Или "String/headers/String.h"
При использовании g++ #include "String\\headers\\String.h" приводит к следующему
- Ведется поиск такого в папке с
.cppфайлом (только дляincludec кавычками). - Ведется поиск в папках, указанных с помощью ключа компиляции
-I. - Ведется поиск в папках, указанных с помощью ключа компиляции
-iquote(только дляincludec кавычками). - Ведется поиск в папках, указанных с помощью ключа компиляции
-isystemили в системных.
Реальное же положение файла здесь headers/String.h при компиляции main.cpp или ../headers/String.h для String.cpp.
Директива #include <String\headers\String.h> заставляет искать подпуть String\headers\String.h в системных папках и тех, что указаны с помощью -I.
Чтобы сработал "String\headers\String.h", с помощью -iquote надо задать путь к папке, в которой содержится папка проекта. Это неудобно - Visual Studio "не любит" путей с двумя точками, выходящих за пределы папки проекта.
Проще использовать "headers\String.h" и ключ -I, указывающий на корень проекта, но у этого есть недостатки - зависимость от среды разработки. Например с CMake вообще можно использовать только имена файлов, а в список добавить перечень всех папок.
Переносимым способом, не зависящим от инструментов, является использования реального относительного пути (см.выше).
