C++ Makefile总是重新编译

C++ Makefile总是重新编译,c++,makefile,C++,Makefile,我在使用下面的Makefile时遇到了困难。它总是重新编译,因为它在“source/”而不是“objects/”中查找对象 由于我没有编写Makefile,也不知道所有这些选项意味着什么,所以我不知道如何告诉它在正确的文件夹中查找对象 TITLE=示例\u TITLE SRC_DIR=源/ OBJ_DIR=对象/ OUTDIR=build/ SRC:=$(通配符**/*.cpp) OBJ:=$(patsubst源代码/%.cpp,%.o,$(SRC)) FP_OBJ:=$(patsubst%,o

我在使用下面的Makefile时遇到了困难。它总是重新编译,因为它在“source/”而不是“objects/”中查找对象

由于我没有编写Makefile,也不知道所有这些选项意味着什么,所以我不知道如何告诉它在正确的文件夹中查找对象

TITLE=示例\u TITLE
SRC_DIR=源/
OBJ_DIR=对象/
OUTDIR=build/
SRC:=$(通配符**/*.cpp)
OBJ:=$(patsubst源代码/%.cpp,%.o,$(SRC))
FP_OBJ:=$(patsubst%,objects/%,$(OBJ))
LIB=$(通配符*.a)$(通配符**/*.a)
CC=g++
LD=g++
CC_标志=-m32-c-Wall-g-o
可执行文件=$(标题)
LD_FLAGS=-m32-L/usr/lib32-o$(OUTDIR)$(可执行)
$(OUTDIR)$(可执行文件):$(OBJ)
$(LD)$(LD_标志)$(FP_OBJ)$(LIB)
$(OBJ):$(SRC)
$(CC)$(CC_标志)$(OBJ_DIR)$@$(SRC_DIR)$*.cpp
$(TITLE).tar.gz:*/*.h**/*.cpp Makefile**/*.txt
tar-czf$@Makefile**/*.h**/*.cpp**/*.txt
地区:$(标题).tar.gz
全部:$(OUTDIR)$(可执行文件)
清洁:
rm-f$(对象目录)*.o
rm-f$(OUTDIR)$(可执行文件)$(标题).tar.gz
这应该可以做到:

$(OUTDIR)$(EXECUTABLE) : $(FP_OBJ)
    $(LD) $(LD_FLAGS) $^ $(LIB)

$(FP_OBJ) : $(OBJ_DIR)%.o : $(SRC_DIR)%.cpp
    $(CC) $(CC_FLAGS) $@ $<
除了
$(OBJ):$(SRC)
使每个对象依赖于所有源之外,该规则承诺
foo.o
并交付
对象/foo.o
。因此,Make每次都看到没有
foo.o
,并适时地尝试重建它和需要它的可执行文件


这个makefile还存在其他问题,比如草率的通配符和在目录名中包含斜杠的令人讨厌的做法,但它们并不是那么严重。

我也很讨厌,因为我只是写了一条注释来解释你的修复方法。尽管静态模式规则不需要在目标/prereq模式上加后缀才能工作(因为两端的stem不一样)?将来修改makefile将如何帮助其他人?这是一个问答资源,不是一个帮助台……我知道这可能是一个烦人的问题,但我得到了这个制作文件,用于大学作业,我不知道有哪个地方更适合或更快地获得正确答案。然而,Beta版也包含了一个解释,所以这可能会在将来帮助其他人。在询问之前,我也试图自己修复它,但由于不知道如何创建这样的makefile,我什么都没有得到。。。
$(OBJ) : $(SRC)
    $(CC) $(CC_FLAGS)$(OBJ_DIR)$@ $(SRC_DIR)$*.cpp