如果我在makefile中有以下规则:
$(OBJ)/%.o: $(SRC)/%.c
$(CC) -c -o $@ $< $(CFLAGS)
与前缀./obj/
和su .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)
)。
答案 0 :(得分:11)
您只需替换此规则:
$(OBJECTS): $(SRC)/%.c
使用:
$(OBJECTS) : %.o : $(SRC)/%.c
如果您仍希望在食谱中构建$(OBJ)
部分,则需要将其添加到-o
部分:
$(OBJECTS) : %.o : $(SRC)/%.c
$(CC) -c -o $(OBJ)/$@ $< $(CFLAGS)
答案 1 :(得分: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}
。
如果这不是你想要做的,你将能够通过列出你拥有的输入文件,你想要输出的文件,每个输出文件的输入依赖关系,得到更好的答案,以及要为每个输出文件执行的编译命令。