2013-10-25 37 views
3

我通常使用这一行OBJECTS = $(SOURCES:.cpp=.o)将源文件中的.cpp扩展名替换为.o扩展名。 我的项目现在有.c扩展名和.cpp文件。如何修改该行以使其替换.o和.cpp的所有.o扩展名?Makefile中的替换文件名

我不喜欢像下方的两行的解决方案:

OBJECTS_TMP = $(SOURCES:.cpp=.o)

OBJECTS = $(OBJECT_TMP:.c=.o)

我想是这样

OBJECTS = $(SOURCES:(.cpp|.c)=.o)

甚至

OBJECTS = $(SOURCES:.*=.o)

这是可能的和如何?谢谢!

+0

粗略估计,但没有测试它:'$(SOURCES:.c = .o:.cpp = .o)'? –

+0

@NiklasR'$(SOURCES:.c = .o:.cpp = .o)'给了我多***个目标模式。 Stop.'和'$(SOURCES:.cpp = .o:.c = .o)'给出'***目标模式不包含'%'。 Stop.' –

回答

2

你不能只用简写。你将不得不使用patsubst功能:

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

或者您可以使用各自的一个:

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

或者,你可以做这样的:

OBJECTS = $(addsuffix .o,$(basename $(SOURCES))) 
+0

哦,我忘了筑巢。这可能也工作'OBJECTS = $($(SOURCES:.cpp = .o):. c = .o)'。谢谢! –

+0

没有。在速记方法中,操作的项目必须是_variable name_。它不能是一些随机的值。在发布之前,您只需花几秒钟的时间尝试一下,发现它不起作用,顺便说一句。 – MadScientist