我的目录里有3个文件,如下所示。
foo.h
foo.cc
main.cc
build/ <-- Created if doesn't exist.
.o
和可执行文件,并在 build
文件夹在同一目录下。
我也不想让代码在没有任何改变的情况下重新编译。
这是我的Makefile。
CC=g++
CFLAGS=-std=c++17
OBJS=build/foo.o
.PHONY: all clean
all: build/main
build/main: main.cc $(OBJS)
$(CC) $(CFLAGS) -o $@ $^
build/%.o: %.cc build
$(CC) $(CFLAGS) -c -o $@ $<
build:
mkdir -p build
clean:
rm -rf build
如果我运行 make build/foo.o
如果源代码没有任何变化,它不会重新编译。
但是 make all
或 make build/main
总是重新编译一切。我到底做错了什么?
如果我把编译后的代码输出到同一个目录下,就不会出现这个问题。
呃,就在发完这个帖子的几分钟后,我发现了这个。谷歌回答.
问题是,由于 build
目录中的时间戳被更新,即使目录中的一个文件被创建更新,它也会从头开始重建。
上面的链接中列出了几种方法来解决这个问题。我最后只是在管子中添加了一个(|
)运算符到 build
规则,使其成为仅有订单的先决条件,即这一行。
build/%.o: %.cc |build
$(CC) $(CFLAGS) -c -o $@ $<
这似乎已经解决了问题。