gpt4 book ai didi

makefile - 在gnu make中,静态模式规则中的先决条件可以有不同的后缀吗

转载 作者:行者123 更新时间:2023-12-02 19:32:17 31 4
gpt4 key购买 nike

我们的 make 文件使用如下静态模式规则编译 .c 源文件:

OBJECTS = foo.o bar.o baz.o

$(OBJECTS): %.o: %.c
$(CC) $< $(C_OPTIONS) -c -o $@

我需要将其中一个 .c 文件更改为 Objective-C .m 文件。对于两种源类型,调用编译器是相同的,因此我想使用相同的规则,只是调整它以使其更加灵活。我不想更改 OPTIONS 变量,因为它也用于链接步骤等。

有没有办法使上述规则更灵活以适应 .c 和 .m 文件?

谢谢

最佳答案

我们可以将这种非此即彼的行为添加到 Make 应该能够轻松完成但实际上却做不到的事情列表中。这是一种方法,使用“eval”为每个对象创建单独的规则。

define RULE_template$(1): $(wildcard $(basename $(1)).[cm])endefOBJECTS = foo.o bar.o baz.o$(foreach obj,$(OBJECTS),$(eval $(call RULE_template,$(obj))))$(OBJECTS):    $(CC) $< $(C_OPTIONS) -c -o $@ 

请注意,这取决于运行 Make 之前已存在的源文件(foo.c 或 foo.m,但不是两者)。如果您在同一步骤中生成这些源,则这将不起作用。

这是一个不太聪明、更稳健的方法

CPP_OBJECTS = foo.o bar.oOBJECTIVE_OBJECTS = baz.oOBJECTS = $(CPP_OBJECTS) $(OBJECTIVE_OBJECTS)$(CPP_OBJECTS): %.o: %.c $(OBJECTIVE_OBJECTS): %.o: %.m $(OBJECTS):    $(CC) $< $(C_OPTIONS) -c -o $@ 

编辑:更正了对象分配,感谢 Jonathan Leffler。

关于makefile - 在gnu make中,静态模式规则中的先决条件可以有不同的后缀吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1603630/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com