13

我有一些目标(比如说 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

还是有其他方法可以解决我的问题?

谢谢你的帮助

4

2 回答 2

18

没有比这更容易的了:

$(ECHO): $(ECHO_O)
$(FOO): $(FOO_O)

$(ECHO) $(FOO):
        $(CC) $(CFLAGS) -o $@ $^

或者您可以取消变量ECHO_OFOO_O完全使用静态模式规则

$(ECHO) $(FOO): % : %.o
        $(CC) $(CFLAGS) -o $@ $^
于 2013-10-08T22:07:58.723 回答
1

对于更大的规则,调用函数罐头食谱可能很有用。

这是一个未经测试的调用函数示例:

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)

这些示例包含多行变量以及自动变量

以防万一,这里有一个我觉得有用的教程链接:link

于 2021-04-19T11:46:44.170 回答