c++ - 尽管配方“全部”被标记为虚假,但多个程序的 Makefile 每次都会重建
问题描述
问题如标题所述。每次我输入make
时,即使没有对代码进行任何更改,这些命令也会运行
g++ -o ./bin/prog1 ./obj/prog1.o -I./include
g++ -o ./bin/prog2 ./obj/prog2.o -I./include
Makefile 位于项目文件夹的根目录,其余文件分别位于、 和include
文件obj
夹中。这是 Makefile 代码:src
bin
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
任何帮助,将不胜感激。
解决方案
标记all
为.PHONY
意味着目标将始终被认为是脏的,并且将重新评估其配方。如果您不希望这样,请将这两个程序移动到显式目标中:
$(BINDIR)/prog1: $(OBJ1)
$(CC) -o $@ $^ $(CFLAGS)
$(BINDIR)/prog2: $(OBJ2)
$(CC) -o $@ $^ $(CFLAGS)
all: $(BINDIR)/prog1 $(BINDIR)/prog2
现在重新制作all
目标将确保prog1
并且prog2
是最新的,但不再运行任何命令。
推荐阅读
- javascript - Puppeter - iFrame 内的链接
- python - SQLite 命令在 Python 上的输出与 DB Browser 不同
- c# - 设置 RowDefinition 可以采用 Xamarin 应用程序的最大高度
- java - 如何在 Java 中查询多个键的内存缓存?
- r - R - 将 CHR 转换为日期
- html - 将表格页脚固定到页面底部,同时保持列的大小正确
- javascript - 如何在 NodeJS 中使用 body.req 从输入表单中检索数据?
- mysql - 如何在 eloquent laravel 中使用别名编写 SQL 查询?
- php - MySQL 8.0.15 连接
- tensorflow - Tensorflow 数据集 - 有什么意义