C++ make:匹配多个扩展的模式规则
我为几个扩展复制了模式规则(例如:C++ make:匹配多个扩展的模式规则,c++,makefile,gnu-make,C++,Makefile,Gnu Make,我为几个扩展复制了模式规则(例如:cpp和cc): 有没有一种方法可以让一个模式规则在两个扩展上都匹配,而不必有两个规则?没有,您不能将这两个规则组合在一起。所有先决条件都必须匹配 但是你可以避免两次指定食谱 通过使用配方的定义: define COMPILE @$(CXX) $(CPPFLAGS) -I. -o $@ -c $? endef $(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp $(COMPILE) $(OBJ_DIR)/%.o: $(SRC_D
cpp
和cc
):
有没有一种方法可以让一个模式规则在两个扩展上都匹配,而不必有两个规则?没有,您不能将这两个规则组合在一起。所有先决条件都必须匹配 但是你可以避免两次指定食谱 通过使用配方的定义:
define COMPILE
@$(CXX) $(CPPFLAGS) -I. -o $@ -c $?
endef
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cpp
$(COMPILE)
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.cc
$(COMPILE)
或者通过使用循环和评估来定义配方(未经测试,我可能会犯一些错误,但我还是更喜欢定义方法):
你可以用这个。下面是一个可执行示例:
OBJ_DIR:=obj
SRC_DIR:=src
TARGETS:=obj/foo.o obj/bar.o
all: $(TARGETS)
.SECONDEXPANSION:
$(OBJ_DIR)/%.o: $$(wildcard $(SRC_DIR)/%.cpp) $$(wildcard $(SRC_DIR)/%.cc)
@$(CXX) $(CPPFLAGS) -I. -o $@ -c $<
如果您同时拥有foo.cc
和foo.cpp
,则其行为将与此处所问问题中的版本相同(foo.cpp
将优先于foo.cc
,这将被忽略)
$
符号是$$(通配符…
的两倍,以防止在第一次扩展期间进行计算。您可以使用$$(SRC_DIR)
以及$(SRC_DIR)
,因为这并不重要(在上面的代码中)当这个变量被扩展时。我不知道你的情况,但这对我来说就像是黑魔法,在过去的30年里,我一直在使用make
开关。这真的有效吗?我本以为这需要更像$(OBJ_DIR)/%.o:$$(通配符$$(SRC_DIR)/$$.cpp)$$(通配符$$(SRC_DIR)/$$.cc)
匹配干上的通配符。我还想知道这在更复杂的场景中是否会有问题。但它很聪明。@EtanReisner你试过吗?我试过了。没有,所以问题就来了。我没有一个匹配模式的好模型……哦,我知道这是怎么回事了。模式首先扩展,然后通配符只是删除了一条路径这是不存在的。我正以另一种方式考虑它(这没有意义)。接受@Louis的答案,因为它在技术上是正确的,即使。SECONDEXPANSION
的语法要求意味着我将使用您的方法。“foreach”方法的优点是,它可以推广到多个扩展(想想:图像格式)。我对此进行了扩展。
$(foreach prereq,cc cpp,$(eval $(OBJ_DIR)/%.o: $(SRC_DIR)/%.$(prereq) ; @$(CXX) $(CPPFLAGS) -I. -o $@ -c $?))
OBJ_DIR:=obj
SRC_DIR:=src
TARGETS:=obj/foo.o obj/bar.o
all: $(TARGETS)
.SECONDEXPANSION:
$(OBJ_DIR)/%.o: $$(wildcard $(SRC_DIR)/%.cpp) $$(wildcard $(SRC_DIR)/%.cc)
@$(CXX) $(CPPFLAGS) -I. -o $@ -c $<
g++ -I. -o obj/foo.o -c src/foo.cc
g++ -I. -o obj/bar.o -c src/bar.cpp