2013-10-25 77 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