我想做这样的事情:
$(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)
但是$@自动变量好像不能这么用。有什么方法可以创建一个通用规则,我可以用它来创建多个二进制文件,主要使用相同的源文件,唯一的异常(exception)是单独的 .c 文件(与目标二进制文件同名)?
最佳答案
以下是通用规则的示例:
%: %.cpp
g++ -o $@ $^ -std=c++17 -lpthread
如果你调用上面的 Makefile 说,make testprog
, 它将把上面的规则翻译成:
testprog: testprog.cpp
g++ -o testprog testprog.cpp -std=c++17 -lpthread
GNU make 为您提供了许多附加功能,您可以使用这些功能创建相当复杂的通用规则。注意 $@
代表目标的名称,而 $^
表示依赖项列表。您也可以使用 $<
引用列表中的第一个依赖项。 %
是指示通过替换实际运行时值来生成规则的占位符。
关于c - 在 Makefile 中,是否可以创建具有通用依赖项的通用规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35109429/