Makefile总是重新编译

时间:2014-05-13 13:31:27

标签: c++ makefile

我在下面的Makefile中遇到了困难。它总是重新编译,因为它正在寻找" source /"中的对象。而不是"对象/"。

因为我没有写Makefile并且不知道所有这些选项意味着什么,我无法弄清楚如何告诉它在正确的文件夹中查找对象。

TITLE =example_title

SRC_DIR = source/
OBJ_DIR = objects/
OUTDIR = build/

SRC := $(wildcard **/*.cpp)
OBJ := $(patsubst source/%.cpp,%.o,$(SRC))
FP_OBJ := $(patsubst %,objects/%,$(OBJ))
LIB = $(wildcard *.a) $(wildcard **/*.a)

CC =g++
LD =g++
CC_FLAGS = -m32 -c -Wall -g -o 
EXECUTABLE = $(TITLE)
LD_FLAGS = -m32 -L/usr/lib32 -o $(OUTDIR)$(EXECUTABLE)

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

$(OBJ) : $(SRC)
  $(CC) $(CC_FLAGS)$(OBJ_DIR)$@ $(SRC_DIR)$*.cpp 

$(TITLE).tar.gz : **/*.h **/*.cpp Makefile **/*.txt
  tar -czf $@ Makefile **/*.h **/*.cpp **/*.txt

dist: $(TITLE).tar.gz

all : $(OUTDIR)$(EXECUTABLE)

clean : 
  rm -f $(OBJ_DIR)*.o
  rm -f $(OUTDIR)$(EXECUTABLE) $(TITLE).tar.gz

1 个答案:

答案 0 :(得分:1)

这应该这样做:

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

$(FP_OBJ) : $(OBJ_DIR)%.o : $(SRC_DIR)%.cpp
    $(CC) $(CC_FLAGS) $@ $<

基本问题在于:

$(OBJ) : $(SRC)
    $(CC) $(CC_FLAGS)$(OBJ_DIR)$@ $(SRC_DIR)$*.cpp

$(OBJ) : $(SRC)使每个对象依赖于所有来源这一事实外,此规则承诺foo.o并传递objects/foo.o 。因此,每次通过时,Make都会看到没有foo.o,并且正在尝试重建它以及需要它的可执行文件。

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