我有一个带有makefile的测试目录,如:
EXECS = pgm1 pgm2 pgm3 pgm4 pgm5 ...
OBJS = $(addsuffix .o, $(EXECS))
all: $(EXECS)
%.o : %.c
$(CC) -c $< -o $@ $(IFLAGS)
$(EXECS) : $(OBJS)
$(CC) $@.o -o $@ $(LFLAGS)
pgm1 : pgm1.o
$(CC) $< -o $@ $(LFLAGS)
% : %.o
$(CC) $< -o $@ $(LFLAGS)
pgm1 : pgm1.o
链接规则有效,但我不想为每个程序输入一个。
% : %.o
规则不起作用(它选择没有链接标记的默认规则)
$(EXECS) : $(OBJS)
规则有效,但每次.o
文件更改时,全部都会链接可执行文件。这并不重要,因为程序很小,但修复会很好。
有什么建议吗?
...后来
感谢大家的建议。解决方案是所有这些解决方案的简单组合:
% : %.c
$(CC) $(IFLAGS) $< -o $@ $(LFLAGS)
答案 0 :(得分:0)
%:%。o规则应该有效,但我猜make是使用优先级较高的默认规则
%:%.c
$(CC) $@.o -o $@
直接从C编译和链接,没有你的变量。
您可以重新定义此默认规则以符合您的需要,或通过编写
删除它%:%.c
没有命令,请参阅http://ftp.gnu.org/old-gnu/Manuals/make-3.79.1/html_chapter/make_10.html#SEC104
答案 1 :(得分:0)
模式规则不起作用,因为您已在$(EXECS) : $(OBJS)
行中为目标定义了明确的规则。显式规则优先于隐式规则,如模式规则。删除显式规则,它将按您的意愿工作:
EXECS = pgm1 pgm2 pgm3 pgm4 pgm5 ...
all: $(EXECS)
%.o : %.c
$(CC) -c $< -o $@ $(IFLAGS)
% : %.o
$(CC) $< -o $@ $(LFLAGS)