gcc включает исходные файлы в подкаталог относительно друг друга в c

#c #gcc #compiler-errors #bluez

#c #gcc #ошибки компилятора #bluez

Вопрос:

У меня возникли проблемы с компиляцией некоторого кода на C.

У меня есть структура кода, подобная следующей

  • main.c
  • Src
    • строка
      • line.h
      • строка.c

Доступно здесь: https://github.com/Vafilor/c_includes

main.c включает #include "src/line/line.h"

src/line/line.c включает #include "src/line/line.h"

Когда я пытаюсь скомпилировать это с gcc main.c src/line/line.c помощью ubuntu 20.4

Я получаю эту ошибку

 src/line/line.c:1:10: fatal error: src/line/line.h: No such file or directory
    1 | #include "src/line/line.h"
      |          ^~~~~~~~~~~~~~~~~
compilation terminated.
  

Как я могу заставить это скомпилировать?

Дополнительная информация:

Я просматривал код bluez в https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree / и у них есть что-то похожее с

  • client/main.c — включает shell.h
  • src/shared/shell.c — включает shell.h
  • src/shared/shell.h

итак, я пытаюсь выяснить, как это работает для их базы кода.

Комментарии:

1. Обычный способ сделать это — передать каталог include в gcc, а затем иметь все #include инструкции относительно этого. gcc -I src .... а затем в исходном коде есть #include "line/line.h" .

2. @kaylum Это сделало это! Я запустил gcc -I ./ main.c src/line/line.c , и он скомпилировался. То, что вы сказали, имеет смысл включать src вместо текущего каталога, и я думаю, что это правильный путь. Спасибо!

3. OT: относительно: когда я пытаюсь скомпилировать это с помощью gcc main.c src/line/line.c в ubuntu 20.4 , это НЕ инструкция компиляции. Скорее это компиляция двух файлов, а затем ссылка. Кроме того, это не включает никаких предупреждений, кроме значений по умолчанию. предлагаю использовать: gcc -c -Wall -Wextra -Wconversion -pedantic -std=gnu11 <name of file to compile.c > -o <name of file to compile.o Затем, после получения чистой компиляции для каждого исходного файла: gcc main.o line.o -o myexec