具有多个目标时如何在 Makefile 规则中的字符串中添加后缀?

How to add suffix to a string in a Makefile rule when having multiple targets?

我的目标是拥有一个 Makefile,它可以在同一目录中编译多个可执行文件。 OBJ 包含除 mains.o 之外的所有 .o 文件,我计划仅在编译特定可执行文件时添加它。逻辑是这样的:调用“make all”将首先尝试使用 OBJ 和 main1.o 构建 main1,但我不知道如何指定 main1.o!我想过使用自动变量 $@ 来获取目标并向其附加 .o 扩展名,但它不起作用。

EXE_ALL = main1 main2 main3
all: $(EXE_ALL)

$(EXE_ALL): $(OBJ) $($@:=.o) # <--- here I don't know how to add the current mains.o?

我知道多目标应该扩展到。

main1: $(OBJ) main1.o
main2: $(OBJ) main2.o
main3: $(OBJ) main3.o

目前它只构建所有内容但不构建 mains.o 文件,它将直接构建可执行文件(它们都可以工作,但我还想要 mains.o),如下所示:main1.cpp OBJ -> main1.

感谢任何帮助。谢谢

我想你只是想要一个 static pattern rule 和指定的目标列表...

EXE_ALL = main1 main2 main3
all: $(EXE_ALL)

$(EXE_ALL): main%: $(OBJ) main%.o

以上基本上提供了规律...

main%: $(OBJ) main%.o

但规定该规则仅对$(EXE_ALL)中指定的目标有效。

为了解决先决条件列表中的 $@,您需要打开 secondary expansion,如下所示:

$ cat Makefile
EXE_ALL = main1 main2 main3
OBJ = whatever.o

.PHONY: all
all: $(EXE_ALL)

.SECONDEXPANSION:
$(EXE_ALL): $(OBJ) $$@.o
        @echo Making $@ from $^

%.o:
        @echo Making $@

输出:

$ make
Making whatever.o
Making main1.o
Making main1 from whatever.o main1.o
Making main2.o
Making main2 from whatever.o main2.o
Making main3.o
Making main3 from whatever.o main3.o