6

如果我在生成文件中有以下规则:

$(OBJ)/%.o: $(SRC)/%.c
    $(CC) -c -o $@ $< $(CFLAGS)

每个匹配前缀./obj/和后缀的文件.o都会将其词干传递给%,因此我可以根据其名称提供一些依赖项。

但是,假设我有这样的规则,我会一一指定我想要的目标:

OBJECTS=abc.o bca.o cba.o
$(OBJECTS): $(SRC)/%.c
    $(CC) -c -o $@ $< $(CFLAGS)

如何使%词干真正适用于当前目标名称make正在执行?只是使用%是行不通的,也不行$@

请注意,我正在尝试将实际目标名称写入它自己的依赖项。例如,当make为 执行规则时abc.o,它将包含$(SRC)/abc.c并且仅包含它(类似于$(patsubst %.o, $(SRC)/%.c, MAGIC_TARGET_NAME_VARIABLE))。

4

2 回答 2

12

您可以替换此规则:

$(OBJECTS): $(SRC)/%.c

和:

$(OBJECTS) : %.o : $(SRC)/%.c

如果您仍然希望它们在那里构建,您将需要将它们添加$(OBJ)-o配方的一部分:

$(OBJECTS) : %.o : $(SRC)/%.c
     $(CC) -c -o $(OBJ)/$@ $< $(CFLAGS)
于 2013-01-29T01:06:35.607 回答
1

我不完全清楚你在问什么,但我认为这完成了你想要做的事情:

OBJECTS=abc.o bca.o cba.o

.PHONY: all
all: $(OBJECTS:%=obj/%)

$(OBJ)/%.o: $(SRC)/%.c
    echo $(CC) -c -o $@ $< $(CFLAGS)

所有.o文件都已构建;每个.o文件仅使用.c与其对应的文件构建;如果要在编译.o文件的命令中引用所有目标文件或源文件的列表,则可以${OBJECTS}直接引用。


如果这不是您想要做的,您将能够通过列出您拥有的输入文件、您想要制作的输出文件、每个输出文件的输入依赖项以及什么编译来获得更好的答案您要为每个输出文件执行的命令。

于 2013-01-29T01:02:11.247 回答