C++ 有没有办法在GNU Make中使用变量作为规则和先决条件?

C++ 有没有办法在GNU Make中使用变量作为规则和先决条件?,c++,makefile,gnu-make,C++,Makefile,Gnu Make,我试图以这样一种方式设置我的Makefile:我可以在一些变量中定义所有的输入和输出,所以我只需要编写一条规则来编译项目。这允许我最小化Makefile代码,并且仍然可以控制项目中的内容。以下是相关的代码片段: ROOT_OBJS= \ $(B)/main.o \ $(B)/src1.o ROOT_SRC= \ $(SRC)/main.cpp \ $(SRC)/src1.cpp $(TARGET) : $(ROOT_OBJS) $(LD) $(LD

我试图以这样一种方式设置我的Makefile:我可以在一些变量中定义所有的输入和输出,所以我只需要编写一条规则来编译项目。这允许我最小化Makefile代码,并且仍然可以控制项目中的内容。以下是相关的代码片段:


ROOT_OBJS= \
    $(B)/main.o \
    $(B)/src1.o

ROOT_SRC= \
    $(SRC)/main.cpp \
    $(SRC)/src1.cpp


$(TARGET) : $(ROOT_OBJS)
    $(LD) $(LD_FLAGS) $^ -o $@


$(ROOT_OBJS) : $(ROOT_SRC)
    $(CXX) $(CFLAGS) $< -o $@
这是我得到的输出:

g++ main.cpp -o main.o
g++ main.cpp -o src1.o

我知道这是因为你根本不需要第二条规则
make
知道如何从
.cpp
创建
.o
“它总是使用main.cpp”似乎没有错。您可能暗示它从不处理src1。为什么呢什么输出/行为/症状让你这么认为?请演示您遇到的问题。你做了什么?你碰了哪个文件?你期待什么?你在寻找插入整个依赖项行的
$^
。@Yunnosch我编辑了OP以澄清问题。@ryan看看我的方法,你根本不需要第二条规则
make
知道如何从
.cpp
创建
.o
“它总是使用main.cpp”似乎没有错。您可能暗示它从不处理src1。为什么呢什么输出/行为/症状让你这么认为?请演示您遇到的问题。你做了什么?你碰了哪个文件?你期望什么?你在寻找插入整个依赖关系行的
$^
。@Yunnosch我编辑了OP以澄清问题。@ryan看看我的方法,我有没有办法对变量使用模式规则?奇怪的是,也有可能使用静态模式规则:它基本上是一种模式规则,仅限于给定的一组文件:
$(文件):$(模式):$(先决条件)$(配方)
。有关详细信息,请参阅。据我记忆所及,这些规则有一些怪癖,使其难以正确使用,但这并不意味着它们对您的案例没有用处。
据我记忆所及,这些规则有一些怪癖
不太多。基本上,它们被称为“模式规则”,但被视为“显式规则”。因此,它们可以被看作是“foreach”的一种简写形式。有什么方法可以对变量使用模式规则吗?奇怪的是,也有可能使用静态模式规则:它基本上是一种模式规则,仅限于给定的一组文件:
$(文件):$(模式):$(先决条件)$(配方)
。有关详细信息,请参阅。据我记忆所及,这些规则有一些怪癖,使其难以正确使用,但这并不意味着它们对您的案例没有用处。
据我记忆所及,这些规则有一些怪癖
不太多。基本上,它们被称为“模式规则”,但被视为“显式规则”。因此,它们可以被视为“foreach”的一种速记。
g++ main.cpp -o main.o
g++ main.cpp -o src1.o
$(B)/main.o $(B)/src1.o : $(SRC)/main.cpp $(SRC)/src1.cpp
    $(CXX) $(CFLAGS) $< -o $@
$(B)/main.o : $(SRC)/main.cpp
    $(CXX) $(CFLAGS) $< -o $@
$(B)/src1.o : $(SRC)/src1.cpp
    $(CXX) $(CFLAGS) $< -o $@
$(B)/%.o : $(SRC)/%.cpp
    $(CXX) $(CFLAGS) $< -o $@
STEMS := main src1

$(foreach stem,$(STEMS), \
    $(eval $(B)/$(stem).o: $(SRC)/$(stem).cpp ; $(CXX) $(CFLAGS) $< -o $@))