Вы столкнулись с двумя (или, может быть, тремя) из больших недостатков Make. Хорошо использовать файлы там для создания файлов здесь , но не наоборот, и это сбивает с толку, если правило создает что-то отличное от точной цели (а его автоматические переменные работать в условиях, но они этого не делают). К счастью, мы можем обойти эти проблемы.
Make не может найти предпосылки при использовании решения Майкла Кохна, потому что оно ищет class1.o, а не $ (BUILDDIR) class1.o. (И если вы просто скажете ему искать в $ (BUILDDIR) с помощью VPATH, у вас могут возникнуть другие проблемы.)
Самое простое и грубое решение (которое я рекомендую, если вы не слишком опытны) - это грубая сила:
NAMES = class1 class2
OBJECTS = $(patsubst %,$(BUILDDIR)%.o,$(NAMES))
program: $(OBJECTS) configure
g++ $(OBJECTS) -o $@
$(OBJECTS):$(BUILDDIR)%.o:%.cc
g++ -c $^ -o $@
Существуют более изящные решения, использующие более продвинутые методы, но пока это следует делать.