gpt4 book ai didi

makefile patsubst 多个表达式

转载 作者:行者123 更新时间:2023-12-03 12:51:43 25 4
gpt4 key购买 nike

我试图简化我的一些 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com