2017-07-10 5 views
1

Ich habe mit Makefiles für eine Weile jetzt zu kämpfen, da ich nicht wirklich bekommen, wie sie funktionieren ...rekursive Make-Datei für C++ Quelle

Meine Verzeichnisstruktur ist wie folgt:

--bin/ 
--build/ 
--includes/ 
--src/ 
----classes/ 
------somefiles.hpp 
------somefiles.cpp 
----states/ 
------somestates.hpp 
----main.cpp 
----few-other-files.cpp 
--Makefile 
--.gitignore 

, die arbeitete mit meiner Make-Datei in Ordnung, bis ich diese subdirs begann das Hinzufügen, classes und states

ich nicht zu finden scheinen, um, wie diese subdirs in meiner Make-Datei aufzunehmen, die sind:

CC := g++ 
SRCDIR := src 
BUILDDIR := build 
TARGET := bin/game 

SRCEXT := cpp 
SOURCES := $(shell find $(SRCDIR) -type f -name *.$(SRCEXT)) 
OBJECTS := $(patsubst $(SRCDIR)/%,$(BUILDDIR)/%,$(SOURCES:.$(SRCEXT)=.o)) 
CFLAGS := -g -Wall 
LIB := -lsfml-audio -lsfml-graphics -lsfml-network -lsfml-system -lsfml-window 
INC := -I includes -I /usr/local/include -L /usr/local/lib 

$(TARGET): $(OBJECTS) 
    @echo "Linking..." 
    @echo "$(CC) $^ -o $(TARGET) $(LIB)"; $(CC) $^ -o $(TARGET) $(LIB) 

$(BUILDDIR)/%.o: $(SRCDIR)/%.$(SRCEXT) 
    @mkdir -p $(BUILDDIR) 
    @echo "$(CC) $(CFLAGS) $(INC) -c -o [email protected] $<"; $(CC) $(CFLAGS) $(INC) -c -o [email protected] $< 

clean: 
    @echo "Cleaning..." 
    @echo "$(RM) -r $(BUILDDIR) $(TARGET)"; $(RM) -r $(BUILDDIR) $(TARGET) 

.PHONY: clean 

Problem: Fatal error: can't create build/classes/stateManager.o: No such file or directory

Normalerweise ist das Problem ist, dass es das Verzeichnis nicht aufbauen kann. Aber ich dachte, die mkdir -p würde das lösen.

Jede Hilfe wird sehr geschätzt.

+0

Aber du machst nur 'mkdir -p $ (BUILDDIR)' was gleich 'mkdir -p build' ist. Die Unterverzeichnisse (wie 'classes') werden nicht erstellt. Vielleicht interessiert dich die 'dir'-Funktion (siehe zB [dieses' make'-Handbuch zur Dateifunktion] (https://www.gnu.org/software/make/manual/make.html#File-Name-Functions)). –

+0

Auch ein wenig pingelig auf den Begriff "rekursive Makefile". Ein rekursives Makefile ist ein Makefile, das sich selbst aufruft, normalerweise in Unterverzeichnissen. Ihr Makefile ist * nicht * rekursiv. –

+0

Was endete als: '@mkdir -p $ (shell dirname $ @)', Wenn ich richtig liege? – nepp95

Antwort

1

ersetzen:

mkdir -p $(BUILDDIR) 

mit

mkdir -p $(@:D) 

Ein anderer Weg ist make treat Verzeichnisse als Ziele zu lassen und haben sie für Sie automatisch erstellt, so dass Sie nicht zu Unordnung haben Ihre Rezepte mit mkdir -p Aufrufe:

.SECONDEXPANSION: 
# Make the object file depend on its directory using order-only dependency. 
$(BUILDDIR)/%.o: $(SRCDIR)/%.$(SRCEXT) | $$(dir [email protected]) 
    $(CC) $(CFLAGS) $(INC) -c -o [email protected] $< 

# Let make create the directories for your targets. 
%/: 
    mkdir -p [email protected] 

# Do not remove the directories because they are "intermediate" targets. 
.PRECIOUS : %/ 
+0

Funktioniert gut! Vielen Dank für die Erklärung. – nepp95