我创建了一个基于 GNU Make 教程的 makefile:https ://www.gnu.org/savannah-checkouts/gnu/make/manual/html_node/index.html#SEC_Contents 。
make 文件在初始 make 上工作正常,但如果文件更改并运行 make,则会出现循环依赖项丢弃消息,并且它不会构建更改的文件。删除的依赖项是 bin/main.o <-bin/main.o。这是有道理的,因为 main.o 不应该依赖于 main.o。我搜索了几个网站,包括 stackoverflow 并找到了一些有用的答案,但我无法解决我的问题。这两个链接与我的问题最相关: Makefile export .o file to a different path than .cpp和 Makefile 循环依赖错误
根据上述信息,我编辑了我的 makefile,至少现在我可以更轻松地调试了。依赖问题可能与通配符扩展后的后续目标和先决条件有关,但我只是没有看到。
这是我的生成文件:
#For compilation
CC=g++
CC_FLAGS= -g -Wall -Werror -ansi -pedantic
#make[1]: main.o all <- all
#Folder structure
BIN_DIR:=bin
SRC_DIR:=src
H_DIR:=src/header
all:rshell
#VPATH = $(SRC_DIR)
H_FILES:=$(wildcard $(H_DIR)/*.h)
DEPS:$(wildcard $(BIN_DIR)/*.d)
CPP_FILES:=$(wildcard $(SRC_DIR)/*.cpp)
OBJECTS := $(CPP_FILES:$(SRC_DIR)/%.cpp=$(BIN_DIR)/%.o)
$(BIN_DIR)/%.o: $(SRC_DIR)/%.cpp $(H_DIR)/%.h
mkdir -p $(BIN_DIR)
$(CC) -I$(H_DIR) -o $@ -c $< $(CC_FLAGS)
$(BIN_DIR)/main.o:$(SRC_DIR)/main.cpp $(OBJECTS) $(H_FILES)
$(CC) -I$(H_DIR) -o $@ -c $(SRC_DIR)/main.cpp $(CC_FLAGS)
rshell: $(OBJECTS)
$(CC) -o $(BIN_DIR)/$@ $(OBJECTS) $(CC_FLAGS)
include $(DEPS)
$(MAKEFILE_LIST): ;
%:: %,v
%:: RCS/%,v
%:: RCS/%
%:: s.%
%:: SCCS/s.%
.PHONY: clean
clean:
rm -rf $(BIN_DIR)
问题1:如果通配符扩展导致循环依赖,我该如何解决?
问题2:如何跟踪通配符扩展?回显文件名并以这种方式跟踪是否正确?运行 make -d 很有用,但我不知道如何避免它。我的假设是这些行导致了循环依赖:
$(BIN_DIR)/main.o:$(SRC_DIR)/main.cpp $(OBJECTS) $(H_FILES)
$(CC) -I$(H_DIR) -o $@ -c $(SRC_DIR)/main.cpp $(CC_FLAGS)
感谢您的帮助和洞察力。