用Makefile编译目录--每次都能编译。

问题描述 投票:0回答:1

我的目录里有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 allmake build/main 总是重新编译一切。我到底做错了什么?

如果我把编译后的代码输出到同一个目录下,就不会出现这个问题。

makefile
1个回答
1
投票

呃,就在发完这个帖子的几分钟后,我发现了这个。谷歌回答.

问题是,由于 build 目录中的时间戳被更新,即使目录中的一个文件被创建更新,它也会从头开始重建。

上面的链接中列出了几种方法来解决这个问题。我最后只是在管子中添加了一个(|)运算符到 build 规则,使其成为仅有订单的先决条件,即这一行。

build/%.o: %.cc |build
  $(CC) $(CFLAGS) -c -o $@ $<

这似乎已经解决了问题。

© www.soinside.com 2019 - 2024. All rights reserved.