我想做这样的事情:
$(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文件(与目标二进制文件同名)?
答案 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为您提供了许多附加功能,您可以使用它们创建相当复杂的通用规则。请注意,$@
表示目标的名称,而$^
表示依赖项的列表。您也可以使用$<
来引用列表中的第一个依赖项。 %
是占位符,指示通过替换实际的运行时值来生成规则。