我正在尝试简化我的一些makefile,我开始这样做了:
TEMP_OBJECTS_C = $(patsubst %.c,%.c.o,$(C_SOURCES))
TEMP_OBJECTS_CPP = $(patsubst %.cpp,%.cpp.o,$(CPP_SOURCES))
但我真正想要做的只是将.o附加到以.c或.cpp结尾的任何内容。这只适用于.c,如果我想添加cpp文件,我必须进行完全独立的替换。 我试过这个:
TEMP_OBJECTS = $(patsubst %.c,%.c.o,$(SOURCES)) $(patsubst %.cpp,%.cpp.o,$(SOURCES))
SOURCES是所有cpp和c文件,但后来我显然有重复文件,并且原始源文件名在其中......
所以,我接受了这个:
TEMP_OBJECTS = $(patsubst %.c,%.c.o,$(SOURCES))
TEMP_OBJECTS = $(patsubst %.cpp,%.cpp.o,$(TEMP_OBJECTS))
然后它抱怨递归。
有没有办法让我需要的东西? 感谢
答案 0 :(得分:3)
从我的回答here中解释。
使用$(filter)
仅包含您想要的条目。
OBJS = $(filter %.o,$(patsubst %.cpp,%.o,$(CPP_SOURCES)) \
$(patsubst %.c,%.o,$(C_SOURCES)))
那说你也可以使用Substitution References而不是显式调用$(patsubst)来缩短它。
OBJS = $(filter %.o,$(CPP_SOURCES:.cpp=.o) $(C_SOURCES:.c=.o))
如果您想保留原始的最终尝试,那么您只需要简单地扩展变量而不是递归扩展(有关此差异的更多说明,请参阅The Two Flavors of Variables)。
TEMP_OBJECTS := $(patsubst %.c,%.c.o,$(SOURCES))
TEMP_OBJECTS = $(patsubst %.cpp,%.cpp.o,$(TEMP_OBJECTS))
答案 1 :(得分:0)
我会试试
TEMP_OBJECTS = $(patsubst %.c,%.c.o,$(patsubst %.cpp,%.cpp.o,$(SOURCES)))
或类似的东西:
TEMP_OBJECTS_C = $(patsubst %.c,%.c.o,$(SOURCES))
TEMP_OBJECTS = $(patsubst %.cpp,%.cpp.o,$(TEMP_OBJECTS_C))
两者都非常相似,会过滤两次来源。
或已经给出的anser:
TEMP_OBJECTS := $(patsubst %.c,%.c.o,$(SOURCES))
TEMP_OBJECTS = $(patsubst %.cpp,%.cpp.o,$(TEMP_OBJECTS))
:=
将立即评估表达式,从而避免递归。