首页 > 解决方案 > 尽管配方“全部”被标记为虚假,但多个程序的 Makefile 每次都会重建

问题描述

问题如标题所述。每次我输入make时,即使没有对代码进行任何更改,这些命令也会运行

g++ -o ./bin/prog1 ./obj/prog1.o -I./include
g++ -o ./bin/prog2 ./obj/prog2.o -I./include

Makefile 位于项目文件夹的根目录,其余文件分别位于、 和include文件obj夹中。这是 Makefile 代码:srcbin

IDIR=./include
ODIR=./obj
SRCDIR=./src
BINDIR=./bin

CC=g++
CFLAGS=-I$(IDIR)

_DEPS = 
DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))

_OBJ1 = prog1.o
OBJ1 = $(patsubst %,$(ODIR)/%,$(_OBJ1))

_OBJ2 = prog2.o
OBJ2 = $(patsubst %,$(ODIR)/%,$(_OBJ2))

_SRC = prog1.cpp prog2.cpp
SRC = $(patsubst %,$(SRCDIR)/%,$(_SRC))

$(ODIR)/%.o: $(SRCDIR)/%.cpp $(DEPS)
    $(CC) -c -o $@ $< $(CFLAGS)

all: $(OBJ1) $(OBJ2)
    $(CC) -o $(BINDIR)/prog1 $(OBJ1) $(CFLAGS)
    $(CC) -o $(BINDIR)/prog2 $(OBJ2) $(CFLAGS)

clean:
    rm -f $(ODIR)/*.o $(BINDIR)/*

.PHONY: all clean

任何帮助,将不胜感激。

标签: c++makefile

解决方案


标记all.PHONY意味着目标将始终被认为是脏的,并且将重新评估其配方。如果您不希望这样,请将这两个程序移动到显式目标中:

$(BINDIR)/prog1: $(OBJ1)
    $(CC) -o $@ $^ $(CFLAGS)

$(BINDIR)/prog2: $(OBJ2)
    $(CC) -o $@ $^ $(CFLAGS)

all: $(BINDIR)/prog1 $(BINDIR)/prog2

现在重新制作all目标将确保prog1并且prog2是最新的,但不再运行任何命令。


推荐阅读