#c #makefile
#c #makefile
Вопрос:
Я пытался создать 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 $@
lt; $(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
находится at../include
, но по какой-то причине мой компилятор не находит ее. Я использую Linux, а не Windows.
Если я использую команду:$cpp -I../include/ -v
so, чтобы узнать, есть ли проблема с поиском моей папки, но в выводе указано следующее: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, увидев мои ошибки в комментариях и ответе.
EDIT2: По какой-то причине это сработало, когда я переименовал папку, в которую были включены мои файлы.
Комментарии:
1. Простой способ создать блок кода — ввести « нажмите enter вставить код нажмите enter в конце кода и снова введите « и нажмите enter. Я отредактировал добавление « до и после Makefile.
2. @drescherjm Это меня не подвело. Спасибо
3. Возможно, он жаловался, что у вас слишком много кода по сравнению с текстом. Я не знаю. Я задал только один вопрос, но ответил почти на 200.
4. Вы не говорите, что
ODIR
установлено, но я предполагаю, что оно установлено../modules
.5. Обычно мы называем это
CXXFLAGS
» нетCXXLAGS
» .
Ответ №1:
Проблема в этом:
OBJ = main.o ../modules/person.o $(ODIR)/%.o: %.c $(DEPS) $(CXX) -c -o $@
lt; $(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
. Если вы измените все свои способы использования, еслиCXXLAGS
хотитеCXXFLAGS
, то это сработает.Или вы можете создать свое собственное шаблонное правило (или явное правило) для сборки
main.o
без использования встроенного правила make.
Комментарии:
1. Я использовал то, что вы сказали, но и теперь это показывает, когда я компилирую -I (g -I./include -c -o main/main.o modules/main.cpp ) но это все равно не работает.
2. Под «не работает» вы имеете в виду, выдает ту же ошибку о
person.h
том, что его там нет? Ну, в каталоге, в котором вы запускаете make runls ../include/person.h
… что там говорится? Если он говорит, что файл не найден, то где НАХОДИТСЯ файл person.h ?3. Мой включаемый файл был правильным. Я только что переименовал его снова с тем же файлом, и теперь он работает. Спасибо за помощь