在Makefile中替换文件名

4
我通常使用这一行 OBJECTS = $(SOURCES:.cpp=.o) 将 SOURCES 中的 .cpp 文件扩展名替换为 .o 扩展名。现在我的项目中除了 .cpp 文件之外还有 .c 文件。如何修改这一行,使其将所有 .c 和 .cpp 文件扩展名都替换成 .o?
我不希望采用以下两行解决方案: OBJECTS_TMP = $(SOURCES:.cpp=.o) OBJECTS = $(OBJECT_TMP:.c=.o) 我想要像这样的东西: OBJECTS = $(SOURCES:(.cpp|.c)=.o) 甚至可以是这样的: OBJECTS = $(SOURCES:.*=.o) 这是否可行?谢谢!

一个粗略的猜测,但没有测试过:$(SOURCES:.c=.o:.cpp=.o) - Niklas R
@NiklasR $(SOURCES:.c=.o:.cpp=.o) 给我返回了 *** multiple target patterns. Stop.$(SOURCES:.cpp=.o:.c=.o) 则是返回了 *** target pattern contains no '%'. Stop. - Thanh Pham
1个回答

3

你不能仅使用简写完成它。你需要使用patsubst函数:

OBJECTS = $(patsubst %.cpp,%.o,$(patsubst %.c,%.o,$(SOURCES)))

或者您可以使用其中的一种:

OBJECTS = $(patsubst %.cpp,%.o,$(SOURCES:.c=.o))

或者,您可以像这样操作:
OBJECTS = $(addsuffix .o,$(basename $(SOURCES)))

哦,我忘记了嵌套。这个也可能行 OBJECTS = $($(SOURCES:.cpp=.o):.c=.o)。谢谢! - Thanh Pham
不行。在速记方法中,操作的项必须是一个“变量名”。它不能是一些随机的值集合。在发布之前,你只需要尝试一下就可以很快意识到它不起作用了。顺便说一句。 - MadScientist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接