Каталог сборки Makefile и список зависимостей - PullRequest
3 голосов
/ 03 марта 2010

В make-файле я собираю все свои файлы .o в каталоге build :

program: class1.o class2.o class3.o
    g++ $(BUILDDIR)class1.o $(BUILDDIR)class2.o $(BUILDDIR)class3.o -o $@

Было бы здорово сгенерировать $(BUILDDIR)class1.o $(BUILDDIR)class2.o $(BUILDDIR)class3.o из списка зависимостей ...

Я знаю, что $^ выдаст мне список всех зависимостей, разделенных пробелами, но я не могу разобраться с подкаталогом.

Возможно ли это?

А если у меня есть program: class1.o class2.o class3.o configure, могу ли я исключить configure из списка?

Спасибо:)

Редактировать: Решения Майкла работают хорошо, но при этом make не находит зависимости и вынужден все строить каждый раз ... Нет ли более простого способа при неявные правила , такие как program: class1.o class2.o class3.o, для указания размещения двоичных файлов в каталоге build ?

Ответы [ 2 ]

5 голосов
/ 06 марта 2010

Вы столкнулись с двумя (или, может быть, тремя) из больших недостатков 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 $@

Существуют более изящные решения, использующие более продвинутые методы, но пока это следует делать.

5 голосов
/ 04 марта 2010

с макушки головы

g++ $(addprefix $(BUILDDIR), $^) -o $@

должен это сделать.

Инструкция Make содержит список этих функций в разделе 8.3.

...