Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.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
C++ make:匹配多个扩展的模式规则_C++_Makefile_Gnu Make - Fatal编程技术网

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