Итак, это мое дерево исходного кода для простого приложения для создания заметок, которое я создаю.
Folder PATH listing for volume Seagate Ext
Volume serial number is 6C91-D326
E:.
ª .gitignore
ª README.md
ª
+---.vscode
ª c_cpp_properties.json
ª settings.json
ª
+---src
ª compile.sh
ª main.c
ª note-taker.config
ª
+---functions
ª create_note.c
ª delete_note.c
ª view_note.c
ª
+---includes
foo.c
foo.h
func.h
Всякий раз, когда я бегу gcc main.c includes/foo.c functions/create_note.c functions/view_note.c functions/delete_note.c -o x
, я получаю:
functions/create_note.c:7:10: fatal error: includes/foo.h: No such file or directory
#include "includes/foo.h"
^~~~~~~~~~~~~~~~
compilation terminated.
functions/view_note.c:3:10: fatal error: includes/func.h: No such file or directory
#include "includes/func.h"
^~~~~~~~~~~~~~~~~
compilation terminated.
functions/delete_note.c:3:10: fatal error: includes/func.h: No such file or directory
#include "includes/func.h"
^~~~~~~~~~~~~~~~~
compilation terminated.
Внутри моего create_note.c
вот такие препроцессоры я заказал.
#include <io.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include "includes/foo.h"
#include "includes/func.h"
В func.h
объявлены три функции, все они находятся внутри functions/
, и create_note.c
— одна из них. Выше показано, как расположены препроцессоры внутри create_note.c
, как уже упоминалось. Как мне решить ошибку компиляции?
Я попробовал сделать это в своем #include
:
#include "src\include\foo.h"
#include "./includes/foo.h
Ожидается: программа должна успешно скомпилироваться и работать!
Сначала я попробовал -I
и сделал #include "foo.h"
без добавления includes/
. Позже я увидел ниже, что нам нужно добавить includes/
, и это сработало!!
В конце концов, это довольно просто: если вы объедините папку из параметра -I
с именем, которое вы добавляете в директиву #include
, в результате должен получиться правильный путь. Вы можете разделить путь несколькими способами, если результат после объединения будет правильным.
Понял! Еще раз спасибо
У вас есть два варианта решения этой проблемы.
ОПЦИЯ 1:
предполагая, что текущий рабочий каталог src
, добавьте флаг -I includes/
в gcc
, это позволит gcc
искать заголовки в каталоге includes/
тогда вам придется включить вот так #include "func.h"
вместо этого #include "includes/func.h"
если вы хотите включить его, например #include "includes/func.h"
добавьте вместо него флаг -I .
Вот как будет выглядеть полная команда
gcc main.c includes/foo.c functions/create_note.c functions/view_note.c functions/delete_note.c -I . -o x
ВАРИАНТЫ 2:
преставьте заголовки включения с помощью ../
..
означает предыдущий каталог, поэтому включить includes/func.h
из functions/create_note.c
включить таким образом
#include "../includes/func.h"
ПОЧЕМУ ВАШ КОД НЕ ДАЛ ВАМ ОЖИДАЕМЫЙ РЕЗУЛЬТАТ:
когда вы вводите #include "src\include\foo.h"
, компилятор фактически ищет заголовочный файл в E:\src\functions\src\include
, которого не существует.
он ищет его относительно create_note.c
#include "./includes/foo.h"
не работало по той же причине, единственная разница, которую он искал в другом каталоге, в данном случае это было E:\src\functions\includes
.
Большое спасибо @ammar ! Я сделал #include "includes/foo.h" and then used the
-я. ` flag и это сработало потрясающе. Большое спасибо!! Я пытался проголосовать за ответ, но понимаю, что вам нужна репутация 15, чтобы проголосовать за него. я возьму и проголосую за
Обратите внимание: Каковы преимущества относительного пути, например ../include/header.h, для заголовка?. Обратите внимание, что речь идет об использовании ../
в относительном пути. Имена типа <sys/types.h
без ../
допустимы. В общем, вам следует избегать путей с обозначением ../
. Используйте -I /some/directory/include
, если вы используете #include "header.h"
, или используйте -I /some/directory
, если вы используете #include "include/header.h"
. Будьте последовательны в том, как вы включаете файлы в свой проект.
Слышал это громко и ясно @JonathanLeffler!!
Добро пожаловать в СО. Вы пробовали попросить компилятор заглянуть в вашу основную папку? Если вы предоставляете
src
в качестве папки включения (в gcc вы можете сделать это с помощью опции-I
, тогда вы можете просто использовать относительный путь оттуда в своих файлах. Или есть какая-то причина не использовать эту опцию?