Я пытался сделать 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: По какой-то причине это сработало, когда я переименовал папку, в которой были мои включаемые файлы.
@drescherjm Это не позволило мне. Спасибо
Может быть, он жаловался, что у вас слишком много кода по сравнению с текстом. Я не знаю. Я задал только один вопрос, но ответил почти на 200.
Вы не говорите, на что установлено ODIR
, но я предполагаю, что оно установлено на ../modules
.
Мы обычно называем это CXXFLAGS
, а не CXXLAGS
.
Проблема в следующем:
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), но это все еще не работает.
Под «не работает» вы имеете в виду, выдает ту же ошибку о том, что person.h
не существует? Ну, в каталоге, где вы запускаете make run ls ../include/person.h
... что там написано? Если он говорит, что файл не найден, то где находится файл person.h?
Мой включаемый файл был правильным. Я просто переименовал его снова с тем же файлом, и теперь он работает. Спасибо за помощь
Простой способ создать блок кода — ввести ```, нажать Enter, вставить код, нажать Enter в конце кода, снова ввести ``` и нажать Enter. Я отредактировал добавление ``` до и после Makefile.