Makefile verhält sich merkwürdig
-
Hi, ich bin anscheinend zu blöd make richtig zu verwenden.
Ich wollte das Makefile von volkard (http://www.c-plusplus.net/forum/viewtopic-var-t-is-88418.html) verwenden, aber es gibt mir den folgenden Fehler:
program.cpp:3: *** Missing seperator. Stop.
Aufgepasst, es heißt nicht "Makefile:3: *** usw", das Tab/Leerzeichenproblem ist es also nicht. Ich vermute, dass make irgendwie aus unbekannten Gründen "make program.cpp" ausführt und da auf ein Leerzeichen stößt. (Die betreffende Zeile heißt "int main(){". Ich habe versucht, das Makefile zu verändern, aber es wurde alles irgendwie nur noch merkwürdiger.
Im betreffenden Verzeichnis befindet sich nur das Makefile und program.cpp.
-
ich hab den fehler auch. ich suche mal...
-
Der Fehler war in
EXT := cpp
Es muß stattdessen
EXT := cpp
heißen.
Außerdem geht bei mir
$(OBJECTS): $(BUILDDIR)/%.o: %.$(EXT) $(BUILDDIR)/%.dep $(BUILDDIR)/.tag
nicht und es reicht
$(BUILDDIR)/%.o: %.$(EXT) $(BUILDDIR)/%.dep $(BUILDDIR)/.tag
Das makefile ist total kaputt auf Windows, scheint mir.
-
volkard schrieb:
Der Fehler war in
EXT := cpp
Es muß stattdessen
EXT := cpp
heißen.
Ich verstehe nicht ganz?
-
oben ist am ende der zeile ein leerzeichen. dadurch war $(EXT)=="cpp " und dadurch hat patsubst nicht geklappt und dadurch hat make die main.cpp statt der main.dep inkludiert.
-
Ach du liebe Zeit... und dieses eine Leerzeichen hat mich heute stundenlang aufgehalten.
$(DEPS) musste ich analog zu deinem ersten Post ebenfalls löschen. Jetzt kriege ich das hier:
$ make
Makefile:27: Warnung: Die Befehle für das Ziel »build« werden überschrieben
Makefile:24: Warnung: Alte Befehle für das Ziel »build« werden ignoriert
mkdir -p /
touch /.tag
touch: kann „/.tag“ nicht berühren: Permission denied
make: *** Keine Regel vorhanden, um das Target »build«,
benötigt von »cube«, zu erstellen. Schluss.
-
Habe viel hin- und herprobiert und das geht jetzt bei mir (Windows)
TARGET := ./program CXXFLAGS := -g -Wextra -Wall -Wno-long-long -std=c++98 CXX := c++ LIBS := EXT := cpp BUILDDIR := build SOURCES := $(wildcard *.$(EXT)) OBJECTS := $(patsubst %.$(EXT), $(BUILDDIR)/%.o, $(SOURCES)) DEPS := $(patsubst %.$(EXT), $(BUILDDIR)/%.dep, $(SOURCES)) .PHONY: all all: $(TARGET) test: echo $(SOURCES) echo $(DEPS) echo $(OBJECTS) $(TARGET): $(OBJECTS) $(DEPS) $(CXX) $(CXXFLAGS) -o $(TARGET) $(OBJECTS) $(LIBS) ifneq ($(MAKECMDGOALS), clean) -include $(DEPS) endif $(BUILDDIR)/%.o: %.$(EXT) build/%.dep build/.tag $(CXX) $(CXXFLAGS) -c $< -o $@ $(BUILDDIR)/%.dep: %.$(EXT) build/.tag $(CXX) $(CXXFLAGS) -MM $< -MT $@ -MT $(<:.$(EXT)=.o) -o $@ $(BUILDDIR)/.tag: mkdir $(BUILDDIR) echo tag > $@ .PHONY: clean clean: rm -rf $(BUILDDIR)
Zum rauskopieren am besten im Forum "Zitieren" drücken, dann sind die Tabs und so alle ok.
-
Ok, klappt. Vielen Dank für dein Mühe!
Habs nochmal ein wenig aufgeräumt, weil zweimal kompiliert wurde:
#Achtung: Zeilen müssen mit TAB eingerückt werden TARGET := ./program CXXFLAGS := -g -Wextra -Wall -Wno-long-long -std=c++98 CXX := g++ LIBS := EXT := cpp#Achtung, kein Space BUILDDIR := build#Hier auch nicht SOURCES := $(wildcard *.$(EXT)) OBJECTS := $(patsubst %.$(EXT), $(BUILDDIR)/%.o, $(SOURCES)) DEPS := $(patsubst %.$(EXT), $(BUILDDIR)/%.dep, $(SOURCES)) .PHONY: all all: $(TARGET) $(TARGET): $(OBJECTS) $(CXX) $(CXXFLAGS) -o $(TARGET) $(OBJECTS) $(LIBS) ifneq ($(MAKECMDGOALS), clean) -include $(DEPS) endif $(BUILDDIR)/%.o: %.$(EXT) $(CXX) $(CXXFLAGS) -c $< -o $@ $(BUILDDIR)/%.dep: %.$(EXT) mkdir -p $(BUILDDIR) $(CXX) $(CXXFLAGS) -MM $< -MT $@ -MT $(<:.$(EXT)=.o) -o $@ .PHONY: clean clean: rm -rf $(BUILDDIR)
Das läuft bei mir wunderbar. Kenne mich nicht so aus, aber das dürfte jetzt wirklich ultimativ sein.