我在下面的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
答案 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还有其他问题,比如草率的通配符和在目录名中包含斜杠的令人讨厌的做法,但它们并不那么严重。