Я в тупике, придумывая правило makefile, чтобы иметь несколько исполняемых файлов, каждый из которых зависит от соответствующего исходного файла. Существует общая для всех библиотека, и каждая программа имеет один исходный файл: a.c
, скомпилированный и связанный с библиотекой, выдает исполняемый файл a
и т. д.
LIB_C_FILES = f1.c f2.c f3.c
LIB_H_FILES = f1.h f2.h f3.h
TARGETS = a b c
CFLAGS = -g -O0 -DDEBUG
.PHONY : all clean
.c.o:
g++ -c $(CFLAGS) -o $@ $<
all: $(TARGETS)
${TARGETS} : lib.a ${@:%=%.c}
g++ $(CFLAGS) ${@:=.c} -o $@ lib.a
lib.a: ${LIB_C_FILES:.c=.o} $(LIB_H_FILES)
ar r $@ $?
Библиотечная часть работает нормально. И когда исполняемый файл не существует, он также отлично работает. Но когда один из автономных исходных файлов изменяется, он говорит make: Nothing to be done for 'all'.
Я не понимаю, как правильно сделать так, чтобы цель a
зависела от источника a.c
отдельно в списке. Что мне не хватает?