Makefile: цель с шаблоном не работает - PullRequest
0 голосов
/ 04 октября 2011

Мой Makefile выглядит так:

BIN     = bin
OBJECTS = object1.o \
          object2.o \
          object3.o
HDR     = $(OBJECTS:%.o=%.h) header1.h header2.h
MAIN    = main.c

CC      = gcc
CFLAGS  = -Wall -g -std=c99 -fstack-protector-all
LDFLAGS = -lpthread

$(BIN): $(OBJECTS) $(MAIN)
    $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^

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

Кажется, что правило %.o: %.c $(HDR) не используется. При вызове с параметром make -r он говорит, что нет правила делать цель object.o. Сборка каждого объектного файла должна зависеть от каждого заголовочного файла. Чего мне не хватает?

Редактировать: Следует отметить, что при выполнении echo $(HDR), похоже, переменная содержит правильные значения: object1.h object2.h object3.h header1.h header2.h

Ответы [ 3 ]

2 голосов
/ 04 октября 2011

Шаблонное правило не может иметь вспомогательных зависимостей, таких как ${HDR}.

Использование:

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

${OBJECTS}: ${HDR}
2 голосов
/ 04 октября 2011

В объявлении HDR вместо этого попробуйте $ (OBJECTS: .o = .h).Или, еще лучше, используйте gcc -MM или подобное, чтобы генерировал ваши зависимости вместо .

0 голосов
/ 04 октября 2011

Хорошо, данный Makefile должен работать, у меня была опечатка в одном из имен файлов заголовков.

Жаль, но make не предупреждает об этом. Кажется, что когда правило, основанное на шаблонах, пропускает предварительное условие, оно просто игнорируется. Вместо этого используется встроенное .o правило создания.

Предложение Джонатана Леффлера о ${OBJECTS}: ${HDR} подняло это, потому что есть ошибка относительно "нет правила делать цель неправильно написанным. H" - я бы ожидал этого и от моего правила.

Так что я могу просто согласиться на пушистость, лучше вместо этого использовать автоматически сгенерированные зависимости.

...