Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
makefile patsubst多个表达式_Makefile - Fatal编程技术网

makefile patsubst多个表达式

makefile patsubst多个表达式,makefile,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,$(SO

我正在尝试简化一些生成文件,我开始这样做:

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))
源代码都是cpp和c文件,但很明显我得到了重复的文件,其中的原始源文件名

所以,我选择了这个:

TEMP_OBJECTS = $(patsubst %.c,%.c.o,$(SOURCES))
TEMP_OBJECTS = $(patsubst %.cpp,%.cpp.o,$(TEMP_OBJECTS))
但后来它抱怨递归性

有什么办法可以满足我的需要吗?
谢谢你对我的回答进行解释

使用
$(过滤器)
仅包括所需的条目

OBJS = $(filter %.o,$(patsubst %.cpp,%.o,$(CPP_SOURCES)) \
    $(patsubst %.c,%.o,$(C_SOURCES)))
也就是说,您还可以使用而不是显式调用$(patsubst)来将其缩短一点

OBJS = $(filter %.o,$(CPP_SOURCES:.cpp=.o) $(C_SOURCES:.c=.o))
如果您希望保留最初的最终尝试,那么只需要简单地扩展变量,而不是递归地扩展(有关此差异的更多解释,请参阅)

我会试试看
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))
两者都非常相似,将对源进行两次过滤

或者已经给出的答案:

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

:=
将立即计算表达式,从而避免递归。

可能会使用此表达式。我只是想找到一种方法来减少我的makefile上的行数,并避免临时变量等等……我认为最后一个例子的风格是相反的;正如所写的,它仍然会抱怨递归。
:=
应该在第二行,
=
应该在第一行。
TEMP_OBJECTS := $(patsubst %.c,%.c.o,$(SOURCES))
TEMP_OBJECTS = $(patsubst %.cpp,%.cpp.o,$(TEMP_OBJECTS))