C++ 多个程序的Makefile每次都会重新生成,尽管配方';全部';被标记为假的
问题如标题所述。每次我键入C++ 多个程序的Makefile每次都会重新生成,尽管配方';全部';被标记为假的,c++,makefile,C++,Makefile,问题如标题所述。每次我键入make,即使没有对代码进行更改,这些命令也会运行 g++ -o ./bin/prog1 ./obj/prog1.o -I./include g++ -o ./bin/prog2 ./obj/prog2.o -I./include Makefile位于项目文件夹的根目录下,其余文件分别位于include、obj、src和bin文件夹中。以下是Makefile代码: IDIR=./include ODIR=./obj SRCDIR=./src BINDIR=./bin
make
,即使没有对代码进行更改,这些命令也会运行
g++ -o ./bin/prog1 ./obj/prog1.o -I./include
g++ -o ./bin/prog2 ./obj/prog2.o -I./include
Makefile位于项目文件夹的根目录下,其余文件分别位于include
、obj
、src
和bin
文件夹中。以下是Makefile代码:
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
IDIR=。/包括
ODIR=/obj
SRCDIR=/src
BINDIR=/bin
CC=g++
CFLAGS=-I$(IDIR)
_DEPS=
部门=$(patsubst%,$(IDIR)/%,$(部门))
_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)
全部:$(OBJ1)$(OBJ2)
$(CC)-o$(BINDIR)/prog1$(OBJ1)$(CFLAGS)
$(CC)-o$(BINDIR)/prog2$(OBJ2)$(CFLAGS)
清洁:
rm-f$(ODIR)/*.o$(BINDIR)/*
.骗子:都是干净的
任何帮助都将不胜感激。将
all
标记为。虚假
意味着目标将始终被视为肮脏,其配方将被重新评估。
如果您不希望这样,请将这两个程序移动到明确的目标中:
$(BINDIR)/prog1: $(OBJ1)
$(CC) -o $@ $^ $(CFLAGS)
$(BINDIR)/prog2: $(OBJ2)
$(CC) -o $@ $^ $(CFLAGS)
all: $(BINDIR)/prog1 $(BINDIR)/prog2
现在重新生成
all
目标将确保prog1
和prog2
是最新的,但不运行其他命令。这是不对的。你的食谱总是需要准确地创建$@
,而不是其他东西。如果想要的输出是$(BINDIR)/prog1
,那么目标必须是$(BINDIR)/prog1
,而不仅仅是prog1
,并且配方应该使用-o$@
对,没有注意到前缀。让我来解决这个问题。谢谢你的回答,它成功了!我想再问一件事:有没有一种方法可以将include/
下的每个.h
和.hpp
文件或其任何子目录添加到DEPS变量中,而不必将每个子目录硬编码到Makefile中?如果您使用的是GNU make,那么是的。请参阅通配符
函数:但是,请注意,这通常不是您想要执行的操作(除非每个源文件都包含每个头文件)。如果您这样做,那么无论何时更改任何头文件,您的所有代码都将重新编译。我可能应该为每个程序创建一个包含头的依赖项列表。当您将目标声明为。PHONY
时,“每次重建”正是您所要求的。请看第二段。谢谢,我现在明白了,我对makefile还不是很有经验!