我有一些目标(比方说3)。所以在makefile运行之后,我想要有3个可执行文件。
以下是我现在所做的事情:
CC = gcc
CFLAGS = -Wall -pedantic -ansi
ECHO = server_echo
ECHO_O = echo.o
FOO = server_foo
FOO_O = foo.o
ALL = $(ECHO) $(FOO)
ALL_O = ECHO_O FOO_O
all: $(ALL)
$(ECHO): $(ECHO_O)
$(CC) $(CFLAGS) -o $(ECHO) $(ECHO_O)
$(FOO): $(FOO_O)
$(CC) $(CFLAGS) -o $(FOO) $(FOO_O)
.PHONY: clean
clean:
- rm -f $(ALL)
- rm -f *.o
- rm -f core
%.o: %.c
$(CC) $(CFLAGS) -c $<
.PHONY: mci
mci: clean $(ALL)
我对目标$(ECHO)和$(FOO)的规则重复。有什么办法,我可以消除重复吗?类似的东西:
for target, target_o in $(ALL), $(ALL_O)
target: target_o
$(CC) $(CFLAGS) -o target target_o
end for
还是有另一种方法可以解决我的问题吗?
感谢您的帮助
答案 0 :(得分:6)
没有比这更容易了:
$(ECHO): $(ECHO_O)
$(FOO): $(FOO_O)
$(ECHO) $(FOO):
$(CC) $(CFLAGS) -o $@ $^
或者您可以使用static pattern rule完全取消变量ECHO_O
和FOO_O
:
$(ECHO) $(FOO): % : %.o
$(CC) $(CFLAGS) -o $@ $^
答案 1 :(得分:0)
对于更大的规则,the call function 或 canned recipes 可能有用。
这是一个未经测试的调用函数示例:
define COMPILE =
$(CC) $(CFLAGS) -o $(2) $(1)
endef
$(ECHO): $(ECHO_O)
$(call COMPILE,$^,$@)
$(FOO): $(FOO_O)
$(call COMPILE,$^,$@)
这是一个未经测试的罐头食谱示例:
define COMPILE =
$(CC) $(CFLAGS) -o $@ $^
endef
$(ECHO): $(ECHO_O)
$(COMPILE)
$(FOO): $(FOO_O)
$(COMPILE)
示例包含 multi-line variables 和 automatic variables。
以防万一,提供一个我认为有用的教程链接:link。