Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 多个程序的Makefile每次都会重新生成,尽管配方';全部';被标记为假的_C++_Makefile - Fatal编程技术网

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还不是很有经验!