gpt4 book ai didi

c++ - Makefile 总是重新编译

转载 作者:太空宇宙 更新时间:2023-11-04 11:33:37 24 4
gpt4 key购买 nike

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

因为我没有编写 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

最佳答案

应该这样做:

$(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) 使每个 对象都依赖于所有 源这一事实之外,此规则 promise foo.o 并传递 objects/foo.o。所以每次通过时,Make 都会看到没有 foo.o,并适本地尝试重建它和需要它的可执行文件。

此 makefile 还存在其他问题,例如草率的通配符和在目录名称中包含斜杠的令人讨厌的做法,但这些问题并不严重。

关于c++ - Makefile 总是重新编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23632690/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com