Это правило:
$(BDIR)/test: test.o print.o
говорит make, что для сборки $(BDIR)/test
сначала нужно собрать test.o
и print.o
.Итак, он строит эти два файла.Вы определили правило для сборки $(ODIR)/%.o
, но test.o
не соответствует шаблону $(ODIR)/%.o
, поэтому правило не используется.
Вместо этого make использует свои собственные встроенные правила по умолчанию, которые знают, каксоздать %.o
;этот шаблон DOES соответствует вашей цели test.o
.
Если вы хотите, чтобы make строил объекты в другом каталоге, вы должны указать их там, когда напишите свои правила:
$(BDIR)/test: $(ODIR)/test.o $(ODIR)/print.o
Теперь make знает, что вы хотите создать цели в каталоге $(ODIR)
, поэтому он будет использовать правило, которое может это сделать.