具有多个目标时如何在 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
我的目标是拥有一个 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