2016-02-17 3 views
0

Со следующим Makefile сниппета:Makefile развязаны зависимости

main: main.o f1.o f2.o 
    $(CC) $(CFLAGS) -o program main.o f1.o f2.o 

main.o: main.cc 
    $(CC) $(CFLAGS) -c main.cc 

f1.o: f1.cc 
    $(CC) $(CFLAGS) -c f1.cc 

f2.o: f2.cc 
    $(CC) $(CFLAGS) -c f2.cc 

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

$(OBJECTS): $(SOURCES) 
    $(CC) $(CFLAGS) -o [email protected] -c $(patsubst %.o,%.cc,[email protected]) 

Он строит каждый объектный файл по отдельности, но каждый объектный файл зависит от всех моих источников, поэтому изменение в одном файле, вызывая полные перекомпиляции. Что хорошего для этого?

+2

https://www.gnu.org/software/make/manual/html_node/Pattern-Rules.html –

+1

['$ <'] (http://www.gnu.org/software/make/manual/ make.html # Automatic-Variables) более кратким, чем '$ (patsubst% .o,% .cc, $ @)' – Beta

ответ

0

Как прокомментировал Исмаил Бадави, pattern rules обеспечивают хорошее решение. Они представляют собой тип implicit rule для марки. В принципе, неявные правила - это автоматические рецепты, основанные на расширении файла. Например, make знает, как конвертировать файлы .c в файлы .o неявно. По умолчанию марка будет работать следующий рецепт для .c файлов (см rule catalogue):

$(CC) $(CPPFLAGS) $(CFLAGS) -c 

Вы можете изменить процесс либо путем установки переменных CC, CPPFLAGS и CFLAGS, или определив шаблонное правило:

%.o: %.c 
    $(CC) $(CFLAGS) -c $< 

«$ <» выше соответствует названию первого необходимого условия, которое в этом примере будет .c-файлом. См. Комментарий Beta и automatic variables.

1

В принципе, вам нужно указать каждый из зависимых файлов .o в отдельности. Например, каждый .o, вероятно, будет зависеть от другой группы заголовков. Принимая ваш f1.o, вам нужно что-то вроде:

f1.o: include/i.h 
f1.o: another.h dir/and-another.h 
f1.o: f1.cc 
    $(CC) $(CFLAGS) -c f1.cc 

(вы можете иметь столько строк зависимостей для цели, как вам нравится).

Поддержание этого списка - это кошмар. Разбитые списки зависимостей делают ваш Makefile хуже, чем бесполезно —, вы можете использовать пакетный файл.

Все не потеряно! Если вы в порядке, , вы можете получить compiler to do it automatically, и в значительной степени бесплатно. Делает ваш Makefile tidier для загрузки. Win Win.

Смежные вопросы