我们可以将这种非此即彼的行为添加到 Make 应该能够轻松完成的事情列表中,但事实并非如此。这是一种方法,使用“eval”为每个对象创建单独的规则。
定义 RULE_template
$(1): $(通配符 $(basename $(1)).[cm])
endef
对象 = foo.o bar.o baz.o
$(foreach obj,$(OBJECTS),$(eval $(call RULE_template,$(obj))))
$(对象):
$(CC) $< $(C_OPTIONS) -c -o $@
请注意,这取决于运行 Make 之前已经存在的源文件(foo.c 或 foo.m,但不能同时使用两者)。如果您在同一步骤中生成这些源,这将不起作用。
这是一个不太聪明,更健壮的方法。
CPP_OBJECTS = foo.o bar.o
OBJECTIVE_OBJECTS = baz.o
对象 = $(CPP_OBJECTS) $(OBJECTIVE_OBJECTS)
$(CPP_OBJECTS): %.o: %.c
$(OBJECTIVE_OBJECTS): %.o: %.m
$(对象):
$(CC) $< $(C_OPTIONS) -c -o $@
编辑:更正了 OBJECTS 分配,感谢 Jonathan Leffler。