gpt4 book ai didi

c++ - 制作 : circular dependency dropped c++

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

我创建了一个基于 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 .cppMakefile circular dependency error

根据以上信息,我编辑了我的 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)

感谢您的帮助和见解。

最佳答案

$(BIN_DIR)/main.o:$(SRC_DIR)/main.cpp $(OBJECTS) $(H_FILES)

这一行你说要构建 main.o ,我需要 main.cpp *.h 和 *.o

但是 *.o 有 main.o 所以你写 main.o 依赖于 main.o。只需删除 $(OBJECTS) 你不需要对象来构建对象。

$(BIN_DIR)/main.o:$(SRC_DIR)/main.cpp $(H_FILES)

不要使用通配符,最好明确显示您的源文件。 c++编译器不要使用CC,标准使用CXX。

Makefile 示例:

NAME    =   foo

CXX ?= g++

RM = rm

DEBUG ?= no

LEVEL ?= 3

LIB = -l m

INCLUDE = -I include

CXXFLAGS += -Wall -Wextra -O$(LEVEL)
CXXFLAGS += -ansi -pedantic -std=c++11
CXXFLAGS += $(INCLUDE)

ifeq ($(CXX), clang++)
CXXFLAGS += -Weverything
endif

ifneq ($(DEBUG), no)
CXXFLAGS += -g
endif

LDFLAGS = $(LIB)

ifeq ($(DEBUG), no)
LDFLAGS += -s
endif

SRC = main.cpp
SRC += foo.cpp

DPD = $(SRC:.cpp=.dpd)

OBJ = $(SRC:.cpp=.o)

all : $(NAME)

$(NAME) : $(OBJ)
$(CXX) $(OBJ) -o $(NAME) $(LDFLAGS)

clean :
$(RM) -f $(OBJ)
$(RM) -f $(DPD)

fclean : clean
$(RM) -f $(NAME)

re : fclean
$(MAKE) -C .

%.dpd : %.cpp
$(CXX) -MM $(<) -o $(@) $(CXXFLAGS) -MT $(<:.cpp=.o)

%.o : %.cpp
$(CXX) -c $(<) -o $(@) $(CXXFLAGS)

.PHONY : all clean fclean re %.dpd %.o

.SUFFIXES : .o.cpp .dpd.cpp

include $(DPD)

关于c++ - 制作 : circular dependency dropped c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40697867/

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