2016-04-29 8 views
1

Ich versuche, ein Makefile für mein Projekt zu erstellen, aber ich scheinen einige Fehler zu begegnen, wie ich neue Dinge teste. Meine Dateistruktur ist als solche:Fehler beim Ausführen make

~/main #root project folder 
    ~/main/include #header files (mostly class headers) 
    ~/main/src  #source files 
    ~/main/src/obj #object files 
    Makefile 

(Makefile ist im Stammordner des Projekts)

Makefile:

CC=g++ 

IDIR=include 
SDIR=src 
ODIR=src/obj 

DEPS=$(IDIR)/%.h 
OBJS=$(ODIR)/%.o 
SRCS=$(SDIR)/%.cpp 

CFLAGS=-Wall -std=c++11 -I$(IDIR) 

$(OBJS): $(SRCS) $(DEPS) 
    $(CC) -c -o [email protected] $< $(CFLAGS) 

all: $(OBJS) 
    gcc -o run $^ $(CFLAGS) 

.PHONY: clean 

clean: 
    rm -f $(OBJS) 

Für Testzwecke Ich habe eine einzige main.cpp in src Ordner und eine zufällige Header-Datei in include Ordner. Der Fehler, den ich immer bin, wenn der einfachen make Befehl ausgeführt ist folgende:

make: *** No rule to make target `src/obj/%.o', needed by `all'. Stop. 

EDIT: Mit Hilfe der Jungs unter i mit der Lösung kam

CC=g++ 

IDIR=include 
SDIR=src 
ODIR=src/obj 

CFLAGS=-Wall -std=c++11 -I$(IDIR) 

_DEPS = yo.h 
DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS)) 

_OBJ = main.o 
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ)) 

_SRC = main.cpp 
SRC = $(patsubst %,$(SDIR)/%,$(_SRC)) 


$(ODIR)/%.o: $(SRC) $(DEPS) 
    $(CC) -c -o [email protected] $< $(CFLAGS) 

all: $(OBJ) 
    $(CC) -o run $^ $(CFLAGS) $(LIBS) 

.PHONY: clean 

clean: 
    rm -f $(OBJS) 

Antwort

2

Es gibt einen Unterschied in % in Ihren beiden Fällen verwenden. Wenn Sie schreiben:

$(ODIR)/%.o : $(SDIR)/%.cpp $(IDIR)/%.h 

die Muster Substitution tun wird, und eine Reihe von Regeln, wie erstellen:

$(ODIR)/foo.o : $(SDIR)/foo.cpp $(SDIR)/foo.h 

So ist es dort in Ordnung, obwohl Sie die % explizit es verwenden sollten, so ist es klar, um zu sehen, Was macht die Regel?

Aber wenn Sie es hier:

all : $(ODIR)/%.o 

, die buchstäblich für das Ziel suchen $(ODIR)/%.o, für die Sie keine Regel haben. Es gibt keinen Ersatz. Und Sie haben keine Regel, um dieses Ziel zu machen - daher der Fehler. Was Sie gemeint war zu tun haben all hängen von allen tatsächlichen Objekte, für die Sie die wildcard Funktion nutzen möchten werden:

SOURCES = $(wildcard $(SDIR)/*.cpp) 
OBJECTS = $(SOURCES:$(SDIR)/%.cpp=$(ODIR)/%.o) 

all : $(OBJECTS) 
    gcc -o run $^ $(CFLAGS) 
+0

schön scheint zu arbeiten! wird es markieren, wenn ich richtig teste – LeFrillo

+0

Okay kompiliert gut, obwohl es scheint, dass es die O-Dateien nicht unter dem Ordner "obj" platziert. Kann das aus dem Makefile selbst gemacht werden, oder sollte ich es manuell machen? – LeFrillo

+0

@LeFrillo Huh? Wo platziert es sie? – Barry

1

Wenn Sie

OBJS=$(ODIR)/%.o 

Der %.o Teil erweitert sich zu nichts Sinnvollem. Es bleibt nur als der wörtliche Wert %.o. Dasselbe Problem existiert auch für DEPS und SRCS.

Sie müssen die Funktionen wildcard und patsub verwenden. Statt

DEPS=$(IDIR)/%.h 
OBJS=$(ODIR)/%.o 
SRCS=$(SDIR)/%.cpp 

Verwendung

DEPS=$(wildcard $(IDIR)/*.h) 
SRCS=$(wildcard $(SDIR)/*.cpp) 
OBJS=$(patsub %.cpp,%.o,$(SRCS)) 
+0

gcc -o laufen -Wall -std = C++ 11 -Iinclude' 'gcc: Schwerwiegender Fehler: keine Eingabedateien' ' Kompilierung beendet.' ' make: *** [all] Error 4' – LeFrillo

+0

mit den Änderungen – LeFrillo

+0

Fügen Sie unter den Regeln für das Ziel 'all' einige Debugging-Befehle' echo $ (SRCS) 'und' echo $ (OBJS) 'hinzu Stellen Sie sicher, dass die 'Wildcard'-Funktion die korrekten Werte annimmt. –