У меня есть тестовый каталог с файлом makefile, например:
EXECS = pgm1 pgm2 pgm3 pgm4 pgm5 ...
OBJS = $(addsuffix .o, $(EXECS))
all: $(EXECS)
%.o : %.c
$(CC) -c $< -o $@ $(IFLAGS)
$(EXECS) : $(OBJS)
$(CC) [email protected] -o $@ $(LFLAGS)
pgm1 : pgm1.o
$(CC) $< -o $@ $(LFLAGS)
% : %.o
$(CC) $< -o $@ $(LFLAGS)
pgm1: pgm1.o
ссылки pgm1: pgm1.o
работает, но я не хочу вводить его для каждой программы.
Правило %: %.o
не работает (оно берет правило по умолчанию без флажков ссылок)
$(EXECS): $(OBJS)
работает, но все исполняемые файлы связаны каждый раз, когда изменяется файл .o
. Это не имеет большого значения, потому что программы небольшие, но было бы неплохо исправить.
Любые предложения, пожалуйста?
Позже...
Спасибо всем за ваши предложения. Решение - великолепно простая комбинация из них:
% : %.c
$(CC) $(IFLAGS) $< -o $@ $(LFLAGS)
Правило%:%. O должно работать, но я предполагаю, что make использует правило с более высоким приоритетом по умолчанию, поскольку
%:%.c
$(CC) [email protected] -o $@
который компилирует и связывает непосредственно с C без ваших переменных.
Вы можете переопределить это правило по умолчанию в соответствии с вашими потребностями или отказаться от него, написав
%:%.c
без команды, см. http://ftp.gnu.org/old-gnu/Manuals/make-3.79.1/html_chapter/make_10.html#SEC104
Правило шаблона не работает, поскольку вы уже определили явное правило для целей в $(EXECS): $(OBJS)
. Явные правила имеют приоритет над неявными правилами, такими как правила шаблонов. Удалите явные правила, и он будет работать так, как вы хотите:
EXECS = pgm1 pgm2 pgm3 pgm4 pgm5 ...
all: $(EXECS)
%.o : %.c
$(CC) -c $< -o $@ $(IFLAGS)
% : %.o
$(CC) $< -o $@ $(LFLAGS)