2010-03-03 3 views
3

В Makefile, я строю все мои .o файлы в сборки директории с:Makefile Построить список каталогов и зависимостей

program: class1.o class2.o class3.o 
    g++ $(BUILDDIR)class1.o $(BUILDDIR)class2.o $(BUILDDIR)class3.o -o [email protected] 

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

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

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

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

Спасибо :)

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

+0

Это работает? g ++ $ (^:% = $ (BUILDDIR)%) -o $ @ –

ответ

5

Off верхней части моей головы

g++ $(addprefix $(BUILDDIR), $^) -o [email protected] 

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

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

+0

Спасибо! У меня будет более внимательный взгляд на руководство :) – Klaus

+2

Да ... не чувствуешь себя слишком плохо о том, чтобы пропустить это. Как и в большинстве документации GNU, я считаю, что руководство по установке хорошо организовано для людей, которые уже знают все, и просто нужно искать точную орфографию или что-то еще. Если вы не уверены в том, что что-то называется, его невозможно найти в руководстве GNU, не прочитав все это. –

+0

Я использовал это для противоположной проблемы: у меня есть список локальных файлов, и мне нужно добавить путь к ним в каталог и использовать все это в зависимости. – mgold

5

Вы попали в два (или, может быть, три) из больших недостатков Make. Хорошо использовать файлы там, чтобы сделать файлы здесь, но не наоборот, и он путается, если правило делает что-то отличное от точной цели (и автоматические переменные должны работать в предварительных условиях, т). К счастью, мы можем обойти эти проблемы.

Невозможно найти необходимые предпосылки, когда вы используете решение Майкла Коне, потому что оно ищет class1.o, а не $ (BUILDDIR) class1.o. (И если вы просто скажете, чтобы посмотреть в $ (BUILDDIR) с помощью VPATH, вы можете столкнуться с другими проблемами.)

Простейшее, самое грубое решение (которое я рекомендую, если вы не слишком опытны) - это грубая сила:

 
NAMES = class1 class2 
OBJECTS = $(patsubst %,$(BUILDDIR)%.o,$(NAMES)) 

program: $(OBJECTS) configure 
    g++ $(OBJECTS) -o [email protected] 

$(OBJECTS):$(BUILDDIR)%.o:%.cc 
    g++ -c $^ -o [email protected] 

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