如何解决有多个目标时,如何为 Makefile 规则中的字符串添加后缀?
我的目标是有一个单独的 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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。