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.


Anmelden zum Antworten