Я не знаком с XCode и Sublime Text, но могу показать вам демонстрацию проблемы и способы ее решения на уровне компилятора. Вы можете определить, как применить это в настройках компилятора вашей IDE.
Вот содержимое папки проекта для программы:
$ ls -R
.:
header.h main.cpp subfolder
./subfolder:
subheader.h
А вот исходные файлы и заголовки:
$ cat main.cpp
#include <header.h>
int main()
{
return foo();
}
$ cat header.h
#ifndef HEADER_H
#define HEADER_H
#include <subheader.h>
inline int foo() {
return bar();
}
#endif
$ cat subfolder/subheader.h
#ifndef SUBHEADER_H
#define SUBHEADER_H
inline int bar() {
return 42;
}
#endif
Сначала я пытаюсь скомпилировать prog
вот так:
$ g++ -Wall -o prog main.cpp
main.cpp:1:10: fatal error: header.h: No such file or directory
1 | #include <header.h>
| ^~~~~~~~~~
compilation terminated.
, что не работает, потому что препроцессор не знает, где искать систему заголовок <header.h>
. (В этом контексте системный заголовок просто означает файл заголовка, указанный в <...>
, в отличие от локального заголовка , который будет указан в "..."
, и будет выполняться поиск for в текущем каталоге при запуске компилятора).
Я могу исправить это, добавив опцию препроцессора -I dir
, которая сообщает препроцессору искать файлы заголовков в каталоге dir
. Поскольку header.h
находится в текущем каталоге в этой демонстрации, я просто буду использовать .
в качестве имени каталога, а не вводить полное имя каталога.
$ g++ -Wall -I. -o prog main.cpp
In file included from main.cpp:1:
./header.h:4:10: fatal error: subheader.h: No such file or directory
4 | #include <subheader.h>
| ^~~~~~~~~~~~~
compilation terminated.
Это исправление включило header.h
быть найденным, но тогда в header.h
такая же проблема с <subheader.h>
.
Я исправляю это таким же образом:
$ g++ -Wall -I. -I./subfolder -o prog main.cpp
$ ./prog
$ echo $?
42
и теперь все в порядке .
Итак, в первом приближении вам нужно сделать настройки в вашем проекте IDE, чтобы указать, что -I/usr/local/include
и -I/usr/local/include/subfolder
передаются команде компиляции. Но на самом деле первый вам не понадобится, потому что /usr/local/include
всегда является каталогом поиска компилятора по умолчанию для файлов заголовков. Ответы на этот вопрос могут вам помочь, хотя он старый.
Есть ли какой-либо вариант, аналогичный -I dir
, который заставит препроцессор искать рекурсивно в подпапках dir
для разрешения #include <...>
директив? Нет, нет.
Обратите внимание, что если бы я закодировал header.h
с помощью:
#include <subfolder/subheader.h>
вместо:
#include <subheader.h>
, то я мог бы скомпилировать моя программа при второй попытке, g++ -Wall -I. -o prog main.cpp
.
Хорошо организованные пакеты, как правило, имеют свои директивы #include <...>
с необходимыми элементами пути, такими как <subfolder/subheader.h>
, чтобы обеспечить успешную компиляцию максимум с одним -I base/path
option, где base/path
- общий префикс пути для всех директив #include <...>
. Но некоторые пакеты этого не делают, и этому может быть хорошее объяснение.