Makefile - нет такого файла или каталога file.h (не могу найти решение)

Я пытался сделать Makefile, чтобы я мог разрабатывать свой код немного быстрее. Мой Makefile выглядит следующим образом:

IDIR =../include

CXX=g++

CXXFLAGS=-I$(IDIR)

LDIR =../lib

LIBS=-lm

_DEPS = person.h

DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))

OBJ = main/main.o ../modules/person.o  

$(ODIR)/%.o: %.c $(DEPS)

    $(CXX) -c -o $@ $< $(CXXFLAGS)

run: $(OBJ)

    $(CXX) -o $@ $^ $(CXXFLAGS) $(LIBS)

.PHONY: clean

clean:

    rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~ 

Но проблема в том, что терминал выводит следующее сообщение:

g++ -I./include   -c -o main/main.o modules/main.cpp
main/main.cpp:6:10: fatal error: person.h: No such file or directory
    6 | #include <person.h>
      |          ^~~~~~~~~~
compilation terminated.
make: *** [<builtin>: main/main.o] Error 1

Моя папка, в которой person.h находится по адресу ../include, но мой компилятор почему-то ее не находит. Я использую Linux, а не Windows. Если я использую команду:$cpp -I../include/ -v так, чтобы увидеть, есть ли проблема с поиском моей папки, но вывод говорит следующее:

Using built-in specs.
COLLECT_GCC=cpp
OFFLOAD_TARGET_NAMES=nvptx-none:hsa
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 9.3.0-17ubuntu1~20.04' --with-bugurl=file:///usr/share/doc/gcc-9/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++,gm2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-9 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib=auto --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none=/build/gcc-9-HskZEa/gcc-9-9.3.0/debian/tmp-nvptx/usr,hsa --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04) 
COLLECT_GCC_OPTIONS='-E' '-I' '../include/' '-v' '-mtune=generic' '-march=x86-64'
/usr/lib/gcc/x86_64-linux-gnu/9/cc1 -E -quiet -v -I ../include/ -imultiarch x86_64-linux-gnu - -mtune=generic -march=x86-64 -fasynchronous-unwind-tables -fstack-protector-strong -Wformat Wformat-security -fstack-clash-protection -fcf-protection
ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"
ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/9/include-fixed"
ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/9/../../../../x86_64-linux-
gnu/include"
ignoring nonexistent directory "../include/"
#include "..." search starts here:
#include <...> search starts here:
/usr/lib/gcc/x86_64-linux-gnu/9/include
/usr/local/include
/usr/include/x86_64-linux-gnu
/usr/include
End of search list.

В котором написано игнорирование несуществующего каталога "../include/". Я считаю, что это проблема, но я не могу найти решение своей проблемы.

Заранее спасибо.

(Если я поставлю весь путь от пользователя для включения, у меня будет такая же проблема)

Обновлено: Я сделал файл для своего основного и поместил туда свой main.cpp и изменил CXXLAGS на CXXFLAGS, увидев свои ошибки в комментариях и ответе.

РЕДАКТИРОВАТЬ2: По какой-то причине это сработало, когда я переименовал папку, в которой были мои включаемые файлы.

Простой способ создать блок кода — ввести ```, нажать Enter, вставить код, нажать Enter в конце кода, снова ввести ``` и нажать Enter. Я отредактировал добавление ``` до и после Makefile.

drescherjm 09.12.2020 18:59

@drescherjm Это не позволило мне. Спасибо

Akis Lionis 09.12.2020 19:10

Может быть, он жаловался, что у вас слишком много кода по сравнению с текстом. Я не знаю. Я задал только один вопрос, но ответил почти на 200.

drescherjm 09.12.2020 19:13

Вы не говорите, на что установлено ODIR, но я предполагаю, что оно установлено на ../modules.

MadScientist 09.12.2020 19:31

Мы обычно называем это CXXFLAGS, а не CXXLAGS.

Asteroids With Wings 09.12.2020 19:35
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
970
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Проблема в следующем:

OBJ = main.o ../modules/person.o  

$(ODIR)/%.o: %.c $(DEPS)
        $(CXX) -c -o $@ $< $(CXXLAGS)

Итак, это правило шаблона сообщает make, как создать файл, соответствующий шаблону ../modules/%.o, и добавляет переменную CXXLAGS в строку компиляции.

Но вы не предоставили правило для построения main.o, которое не соответствует этому шаблону, потому что его нет в ../modules/.... Поскольку вы не указали свое собственное правило, make использует свое встроенное правило, но это правило не знает о созданной вами переменной CXXLAGS, поэтому оно не добавляет параметр -I в строку компиляции.

Есть по крайней мере три разных способа исправить это в зависимости от того, что вы хотите сделать, что вы не указали четко.

Если вы действительно хотели поместить main.o в каталог ../modules, используйте:

OBJ = ../modules/main.o ../modules/person.o  

заставит это работать.

Если вы действительно хотите, чтобы main.o отображался в том же каталоге, вам нужно определить правило, чтобы создать его там. Вы можете использовать встроенное правило make, чтобы сделать это за вас, но для этого вам нужно использовать встроенные переменные make для управления им: вы используете CXXLAGS, но стандартной встроенной переменной для компиляции C++ является CXXFLAGS. Если вы измените все свои варианты использования if CXXLAGS на CXXFLAGS, то это сработает.

Или вы можете создать собственное шаблонное правило (или явное правило) для сборки main.o без использования встроенного правила make.

Я использовал то, что вы сказали, но теперь это отображается, когда я компилирую -I (g++ -I./include -c -o main/main.o modules/main.cpp), но это все еще не работает.

Akis Lionis 10.12.2020 10:05

Под «не работает» вы имеете в виду, выдает ту же ошибку о том, что person.h не существует? Ну, в каталоге, где вы запускаете make run ls ../include/person.h ... что там написано? Если он говорит, что файл не найден, то где находится файл person.h?

MadScientist 10.12.2020 15:59

Мой включаемый файл был правильным. Я просто переименовал его снова с тем же файлом, и теперь он работает. Спасибо за помощь

Akis Lionis 10.12.2020 16:41

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