c - 使用 define 生成带有 eval 函数的 Makefile 规则

标签 c linux makefile

我想在 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/

相关文章:

linux - 压缩一个文件多次。在 Linux 中使用 gzip 命令的次数

c - perror 和 fprintf 到 stderr 之间有什么区别?

linux - 使用 diff 命令,忽略行尾的字符

linux - 编译OpenEXR时遇到 'undefined reference'和 'error adding symbols'

c - 我的 makefile 是否显示编译错误?

build - 在 Windows 上是否有相当于 Make 的功能?

c - 如何解决 C 添加非常小的 float 的问题?

c - 如何从文本文件中删除?

c - realloc 如何增加内存块的大小?

c - mkdir 的隐式声明