Как мне `включить` пользовательские заголовки, которые находятся внутри `includes/` внутри `functions/create_note.c`

Итак, это мое дерево исходного кода для простого приложения для создания заметок, которое я создаю.

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

Ожидается: программа должна успешно скомпилироваться и работать!

Добро пожаловать в СО. Вы пробовали попросить компилятор заглянуть в вашу основную папку? Если вы предоставляете src в качестве папки включения (в gcc вы можете сделать это с помощью опции -I, тогда вы можете просто использовать относительный путь оттуда в своих файлах. Или есть какая-то причина не использовать эту опцию?

Gerhardh 11.07.2024 15:28

Сначала я попробовал -I и сделал #include "foo.h" без добавления includes/. Позже я увидел ниже, что нам нужно добавить includes/, и это сработало!!

bsod2528 11.07.2024 16:05

В конце концов, это довольно просто: если вы объедините папку из параметра -I с именем, которое вы добавляете в директиву #include, в результате должен получиться правильный путь. Вы можете разделить путь несколькими способами, если результат после объединения будет правильным.

Gerhardh 11.07.2024 16:20

Понял! Еще раз спасибо

bsod2528 11.07.2024 16:29
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
4
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У вас есть два варианта решения этой проблемы.
ОПЦИЯ 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, чтобы проголосовать за него. я возьму и проголосую за

bsod2528 11.07.2024 15:48

Обратите внимание: Каковы преимущества относительного пути, например ../include/header.h, для заголовка?. Обратите внимание, что речь идет об использовании ../ в относительном пути. Имена типа <sys/types.h без ../ допустимы. В общем, вам следует избегать путей с обозначением ../. Используйте -I /some/directory/include, если вы используете #include "header.h", или используйте -I /some/directory, если вы используете #include "include/header.h". Будьте последовательны в том, как вы включаете файлы в свой проект.

Jonathan Leffler 11.07.2024 16:25

Слышал это громко и ясно @JonathanLeffler!!

bsod2528 11.07.2024 17:29

Другие вопросы по теме

Логическое И (&&) неправильно закорачивается в #if
Почему этот макрос переопределяется только при кросс-компиляции, да еще и при наличии #ifndef?
Создайте экземпляры разных классов в соответствии с разными флагами компиляции одного и того же файла заголовка в С++
Определение макроса и использование типов данных для поиска абсолютного значения
Есть ли способ заставить прекомпилятор C использовать математический результат при объединении символов?
Как компилятор C или препроцессор по-разному обрабатывают MACRO с аргументами?
Определение макросов с тем же именем, что и функции стандартной библиотеки
Определите переменную и «верните» выражение в одном макросе C
Могут ли `::` и `*`, образующие тип указателя-члена, происходить из разных расширений макроса или они должны появляться как один токен?
Препроцессор #if директива равенства не работает должным образом