在Makefile中,是否可以创建具有通用依赖关系的通用规则?

时间:2016-01-31 01:45:19

标签: c makefile

我想做这样的事情:

$(BIN_NAME): $(ODIR)/$@.o | $(BDIR)

在这个Makefile中:

.PHONY: clean all
.DEFAULT_GOAL := all

BIN_NAME=example1 example2

CC=gcc

IDIR=inc
LDIR=lib
ODIR=obj
BDIR=bin

CFLAGS=-Werror -Wall -pedantic
INCS=-I$(IDIR)
LIBS=

SRCS=$(wildcard *.c)
OBJS=$(patsubst %.c,$(ODIR)/%.o,$(SRCS))
BINS=$(patsubst %,$(BDIR)/%,$(BIN_NAME))

$(BDIR) $(ODIR):
    @mkdir -p $@

$(ODIR)/%.o: %.c $(DEPS) | $(ODIR)
    @$(CC) -c -o $@ $< $(CFLAGS) $(INCS)

$(BIN_NAME): $(ODIR)/$@.o | $(BDIR)
    @gcc -o $@ $^ $(CFLAGS) $(LIBS)

all: $(BIN_NAME)

clean:
    @rm -rf $(ODIR) $(BDIR)

但似乎$ @自动变量不能像这样使用。有没有什么方法可以创建一个通用规则,我可以使用它创建多个二进制文件,使用大多数相同的源文件,唯一的例外是单独的.c文件(与目标二进制文件同名)?

2 个答案:

答案 0 :(得分:1)

一种(并且最好的)方法是Static Pattern Rules

Toys

答案 1 :(得分:0)

以下是一条通用规则的示例:

%: %.cpp
    g++ -o $@ $^ -std=c++17 -lpthread

如果您使用make testprog调用上述Makefile,它将把以上规则转换为:

testprog: testprog.cpp
    g++ -o testprog testprog.cpp -std=c++17 -lpthread

GNU make为您提供了许多附加功能,您可以使用它们创建相当复杂的通用规则。请注意,$@表示目标的名称,而$^表示依赖项的列表。您也可以使用$<来引用列表中的第一个依赖项。 %是占位符,指示通过替换实际的运行时值来生成规则。