我想在 Makefile 中为许多 PROG 生成这样的规则
CC = gcc
LD = gcc
CFLAGS = -g
LDFLAGS = -g
PROGS = test1 test2
SRCS_test1 = test1.c
SRCS_test2 = test2.c
$(foreach prog, $(PROGS), $(eval OBJS_$(prog) = $(SRCS_$(prog):%.c=%.o)))
.PHONY: all clean
all: $(PROGS)
define PROG_template
$(1): $$(OBJS_$$(1))
@echo ------------------
@echo $(1)
@echo $$(OBJS_test1) $$(OBJS_test2)
@echo $$(OBJS_$(1))
@echo $$^
@echo -----------------
$$(LD) $$(LDFLAGS) -o $$@ $$^
endef
$(foreach prog, $(PROGS), $(eval $(call PROG_template, $(prog))))
%.o: %.c
@echo compiling $@
$(CC) $(CFLAGS) -c -o $@ $<
clean:
rm -f $(OBJS_test1) $(OBJS_test2) $(PROGS)
这样的输出
------------------
test1
test1.o test2.o
-----------------
gcc -g -o test1
gcc提示没有输入文件。 我的 Makefile 有什么问题? 首先感谢。 对不起,我的英语很差。
最佳答案
你有两个错误。第一个只是一个错字;这一行:
$(1): $$(OBJS_$$(1))
应该是:
$(1): $$(OBJS_$(1))
(注意在第二个 $(1)
中删除不需要的 $
。
第二个错误更微妙:在 make 中调用函数时必须注意空格。例如,当您在 call
的参数中保留空格时,它可以嵌入到参数中。所以在这里:
$(foreach prog, $(PROGS), $(eval $(call PROG_template, $(prog))))
^
该空格被逐字用作参数的一部分,因此 '$1'
等效于 'test1'
,而不仅仅是 'test1'
。您可以通过将 eval 替换为 info
来调试 eval
操作,以查看 make 看到了什么:
$(foreach prog, $(PROGS), $(info $(call PROG_template, $(prog))))
会告诉你:
test1: $(OBJS_ test1)
注意额外的空间。
删除多余的空格即可:
$(foreach prog, $(PROGS), $(eval $(call PROG_template,$(prog))))
^^
关于c - 使用 define 生成带有 eval 函数的 Makefile 规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26697441/