Я относительно новичок в (GNU) Make и нахожу это невероятно трудным.Я думаю о переходе на SCons, но все же, я хотел бы понять.
У меня есть make-файл в папке, которая содержит подкаталоги ./src, ./obj/[release|debug] и ./bin[выпуск | отладка].Makefile должен иметь возможность собирать исходные тексты C ++ в ./src, компилировать их в объектные файлы в соответствующем каталоге ./obj, связывать эти объектные файлы и помещать результат в соответствующий каталог ./bin.Вот мой make-файл (отредактированный для простоты):
CONFIG = release
#CONFIG = debug
OBJS = Container.o
OBJDIR = obj/$(CONFIG)
BINDIR = bin/$(CONFIG)
VPATH = src $(BINDIR)
vpath %.o $(OBJDIR)
.PHONY: release
release: $(OBJS)
$(CXX) $(LXXFLAGS) -o $(BINDIR)/$@ $^
Container.o: Container.cpp Container.hpp
$(CXX) -c $(CXXFLAGS) -o $(OBJDIR)/$@ $<
При первом запуске make цель «release» будет искать «Container.o» в текущей папке, а также в $ (OBJDIR).Не найдя его, цель secong будет выполнена правильно, сгенерировав объектный файл в правильной папке.Затем будет выполнена цель «release», но компоновщик пожалуется, что «Container.o» не найден ...
Во второй раз, когда я запускаю make, цель «release» будет искать «Container».o "и найдите его в $ (OBJDIR).После этого компоновщик будет работать правильно (путь к файлу «Container.o» добавляется к имени файла).
Есть ли способ заставить его работать за один проход?Это сводит меня с ума!