我试图简化我的一些 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))
但后来它提示递归。
有什么方法可以制作我需要的东西吗?
谢谢
最佳答案
转述我的回答 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))
关于makefile patsubst 多个表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33740270/