如何在makefile中使用patsubstant进行多个替换

如何在makefile中使用patsubstant进行多个替换,makefile,gnu-make,Makefile,Gnu Make,我正在尝试使用patsubst从makefile中的源文件生成对象文件列表 OUT_DIR=Out/ SRC=../../../Client2.4/Client/src/BrokerModule/BrokerApp.cpp ../../../Client2.4/Client/src/CommandMsgManager/CConfigModuleInfo.cpp OBJ:= $(patsubst %src/%.cpp,${OUT_DIR}$%.o,$(SRC)) 我希望我的

我正在尝试使用patsubst从makefile中的源文件生成对象文件列表

OUT_DIR=Out/

SRC=../../../Client2.4/Client/src/BrokerModule/BrokerApp.cpp     
    ../../../Client2.4/Client/src/CommandMsgManager/CConfigModuleInfo.cpp

OBJ:= $(patsubst %src/%.cpp,${OUT_DIR}$%.o,$(SRC))
我希望我的
OBJ
变量

OBJ=Out/BrokerModule/BrokerApp.o Out/CommandMsgManager/CConfigModuleInfo.o  

在patsubst之后但在patsubst之上不会产生所需的结果。请提供帮助。

在使用
patsubst
时存在一些问题,请参见下面我的建议

OUT_DIR=Out/

SRC=../../../Client2.4/Client/src/BrokerModule/BrokerApp.cpp \
../../../Client2.4/Client/src/CommandMsgManager/CConfigModuleInfo.cpp

# add the definition of src
src=../../../Client2.4/Client/src/

# Modify the definition of OBJ
OBJ:= $(patsubst ${src}%.cpp,${OUT_DIR}%.o,$(SRC))
过滤掉前面的
${src}
和后面的
.cpp
,只保留
BrokerModule/BrokerApp.cpp
&
CommandMsgManager/CConfigModuleInfo.cpp


%
将替换为与上一步中的
%
匹配的文本。

Patsubst只能处理其中包含一个通配符的模式,不幸的是。此外,您正在尝试分离路径名,而不是文件级别的常规方法。这意味着,只要您不知道字符串中
/src/
的前缀和后缀部分,您就不走运了,因为您永远不能说“替换未知前缀并保留未知后缀”(或者反过来说)。 通常的解决方案是“知道”前缀:

OUT_DIR=Out/

SRC_PATH := ../../../Client2.4/Client/src

SRC=../../../Client2.4/Client/src/BrokerModule/BrokerApp.cpp     \
    ../../../Client2.4/Client/src/CommandMsgManager/CConfigModuleInfo.cpp

OBJ:= $(patsubst $(SRC_PATH)/%,${OUT_DIR}%,$(SRC))

$(info $(OBJ))
另一种解决方案是使用make函数库(仍然是beta版,但您的问题可以解决):


那么您可能没有完全使用CWLiu建议的内容。再次检查您的语法和
src
OUT\u DIR
src
的定义。抱歉,它正在工作。我犯了一些错误。谢谢。如果我需要从“OBJ”中省略一个特定的对象文件,我该怎么办。假设我不想让“CommandMsgManager/CConfigModuleInfo.o”进入我正在构建的库?@YogeshTyagi查看文档以获取感谢@Vroomfondel
include gmtt.mk

OUT_DIR=Out

SRC=../../../Client2.4/Client/src/BrokerModule/BrokerApp.cpp     \
    ../../../Client5.6/Client/src/CommandMsgManager/CConfigModuleInfo.cpp

strip-till-last-src = src/$(call implode,$(call down-to,src/,$(call explode,/,$1)))

OBJ:= $(foreach a-path,$(SRC),$(OUT_DIR)/$(call strip-till-last-src,$(a-path)))

$(info $(OBJ))