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.
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
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