1

Ich erstellte ein Makefile auf der Grundlage der GNU Machen Sie das Tutorial: https://www.gnu.org/savannah-checkouts/gnu/make/manual/html_node/index.html#SEC_Contents.Make: zirkuläre Abhängigkeit fallen C++

Die make-Datei funktioniert gut beim ersten make, aber wenn eine Datei geändert wird und make ausgeführt wird, gibt es eine zirkuläre Abhängigkeit droped-Nachricht und die geänderte Datei wird nicht erstellt. Die abgelegte Abhängigkeit ist bin/main.o < -bin/main.o. Dies ist sinnvoll, da main.o nicht von main.o abhängen sollte. Ich habe mehrere Websites durchsucht, einschließlich stackoverflow, und einige nützliche Antworten gefunden, aber ich konnte mein Problem nicht lösen. Diese beiden Verbindungen waren die wichtigsten meine Frage: Makefile export .o file to a different path than .cpp und Makefile circular dependency error

Basierend auf den oben genannten Informationen, die ich meine Make-Datei bearbeitet und zumindest jetzt kann ich einfacher debuggen. Das Abhängigkeitsproblem hat wahrscheinlich mit dem nachfolgenden Ziel und der Voraussetzung nach der Wildcard-Erweiterung zu tun, aber ich sehe es einfach nicht.

Hier ist meine Make-Datei:

#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 [email protected] -c $< $(CC_FLAGS) 

$(BIN_DIR)/main.o:$(SRC_DIR)/main.cpp $(OBJECTS) $(H_FILES) 
    $(CC) -I$(H_DIR) -o [email protected] -c $(SRC_DIR)/main.cpp $(CC_FLAGS) 

rshell: $(OBJECTS) 
    $(CC) -o $(BIN_DIR)/[email protected] $(OBJECTS) $(CC_FLAGS) 

include $(DEPS) 

$(MAKEFILE_LIST): ; 
%:: %,v 
%:: RCS/%,v 
%:: RCS/% 
%:: s.% 
%:: SCCS/s.% 

.PHONY: clean 

clean: 
    rm -rf $(BIN_DIR) 

Question1: Wenn die Wildcard-Erweiterung wird die zirkuläre Abhängigkeit verursacht, wie könnte ich das beheben?

Frage2: Wie verfolgt man die Wildcard-Erweiterung? Wäre es richtig, die Namen der Dateien zu wiederholen und auf diese Weise zu verfolgen? Das Ausführen von make-d war nützlich, aber ich sehe nicht, wie ich es vermeiden kann. Meine Annahme ist, dass diese Zeilen die zirkulären Abhängigkeiten verursachen:

$(BIN_DIR)/main.o:$(SRC_DIR)/main.cpp $(OBJECTS) $(H_FILES) 
    $(CC) -I$(H_DIR) -o [email protected] -c $(SRC_DIR)/main.cpp $(CC_FLAGS) 

Vielen Dank für Ihre Hilfe und Einblick.

Antwort

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

Auf dieser Linie sagen Sie main.o zu bauen, ich brauche main.cpp * .h und * .o

Aber * .o hat main.o so schreiben Sie main.o abhängig von main.o. Entfernen Sie einfach $ (OBJECTS) Sie brauchen kein Objekt um ein Objekt zu erstellen.

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

Verwenden Sie Platzhalter nicht, es ist besser, auf explizite Ihre Quellen-Dateien. Verwenden Sie nicht CC für C++ - Compiler, die Standardanwendung CXX.

exemple von 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) 
+0

Das ist es fixiert. Ich danke dir sehr! Also, ist es besser, wenn möglich Quellen explizit zu deklarieren? Was würde normalerweise getan werden, wenn es eine große Menge an Quellen gibt? Könnte eine andere Datei erstellt werden, um die anderen Quellen zu erstellen? – Program0

+0

Um andere Dateien einzuschließen, können Sie 'include sources.mk' verwenden. Und Sie können damit alle Quellen eines Projekts neu gruppieren [Beispiel] (https://github.com/Stargateur/spider/blob/6e31676a092f7c0477be80cd4043dbfe84ed28b2/server.mk). Es ist besser, Quelldateien explizit anzugeben, da Sie temporäre CPP-Dateien in Ihrem Ordner hinzufügen können oder eine Quelldatei behalten, aber nicht für das Projekt verwenden möchten. Mit dem Platzhalter können Sie keine Quelldateien auswählen. Wie in einer cpp-Datei enthalten Sie nicht jeden Header. In Ihrem Makefile fügen Sie nicht alle Quelldateien hinzu: p – Stargateur

Verwandte Themen