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.
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)). –
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. –
Was endete als: '@mkdir -p $ (shell dirname $ @)', Wenn ich richtig liege? – nepp95