我尝试编译许多文件并将输出放在其他目录中。我有这个Makefile
CC = gcc
BINDIR = bin
SRCDIR = src
SRCS = $(shell find $(SRCDIR) -name *.c)
BINS = $(patsubst $(SRCDIR)/%, $(BINDIR)/%, $(SRCS:.c=.exe))
all: $(BINS)
$(BINS): $(SRCS)
@mkdir -p $(BINDIR)
$(CC) -o $@ $<
clean:
rm -rf bin
和这个目录结构
├── Makefile
└── src
├── bye.c
└── hello.c
当我使用make时,我得到了这个
$ make
gcc -o bin/bye.exe src/bye.c
gcc -o bin/hello.exe src/bye.c
为什么两次都使用src/bye.c
作为源文件?
以及如何编译任何文件?
答案 0 :(得分:0)
因为您的规则使用$<
。如https://www.gnu.org/software/make/manual/html_node/Automatic-Variables.html中所述:
$<
第一个先决条件的名称。如果目标从隐式规则获得其配方,这将是隐式规则添加的第一个先决条件(请参阅Implicit Rules)。
而src/bye.c
是$(SRCS)
的第一个元素。