Почему makefile не сохраняет выходные файлы в другой каталог? - PullRequest
0 голосов
/ 01 мая 2019

Я играю с makefile, и у меня есть эта проблема - она ​​не сохраняет выходные файлы в разные каталоги.

CC = g++
CFLAGS = -c -Wall
ODIR = obj
BDIR = bin

$(BDIR)/test: test.o print.o
    $(CC) test.o print.o -o test

$(ODIR)/%.o: %.cpp %.h
    $(CC) $(CFLAGS) $< -o $@

.PHONY : clean
clean:
    rm -f $(ODIR)/*.o $(BDIR)/test

Даже если я создаю эти каталоги вручную, они не работают должным образом. Оба каталога пустые после «make» без ошибок. Выходные файлы всегда создаются в главном каталоге. Буду рад, если вы сможете дать мне совет.

1 Ответ

0 голосов
/ 01 мая 2019

Это правило:

$(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), поэтому он будет использовать правило, которое может это сделать.

...