makefile pathvariablen richtig



  • Hey,

    ich habe ein kleines Projekt mit einem Freund am laufen und hatte mir überlegt das wir getrennte Ordner für unsere Quelldatein machen (um updates besser einfügen zu können), einmal einen Ordner für ihn "SeinPart" und einemal einen Order für mich "MeinPart" und das wir im Ordner in dem die beiden files drinn sind einfach nur eine makefile bruachen die uns das ganze dann in eine executable übersetzen lässt.
    Nun habe ich aber das problem mit den Pathvariablen, ich habe im internet n kurzbeispiel gefunden indem diese mit ":=" gemacht werden, nun das funktioniert bei mir nicht:

    Tim.files := TimPart\
    Tim.obj = $(Tim.files)Stein.o $(Tim.files)Ebene.o $(Tim.files)Pyramide.o $(Tim.files)Baumeister.o $(Tim.files)main.o
    
    PyramidenBau : $(Tim.obj)
    		g++ -Wall -o PyramidenBauAlphaV0.5 $(Tim.obj)
    
    main.o : $(Tim.files)main.cpp $(Tim.files)Baumeister.h
    	g++ -c $(Tim.files)main.cpp
    
    Baumeister.o : $(Tim.files)Baumeister.cpp $(Tim.files)Baumeister.h $(Tim.files)Pyramide.h
    	g++ -c $(Tim.files)Baumeister.cpp
    
    Pyramide.o : $(Tim.files)Pyramide.cpp $(Tim.files)Pyramide.h $(Tim.files)Ebene.h
    	g++ -c $(Tim.files)Pyramide.cpp
    
    Ebene.o : $(Tim.files)Ebene.cpp $(Tim.files)Ebene.h $(Tim.files)Stein.h
    	g++ -c $(Tim.files)Ebene.cpp
    
    Stein.o : $(Tim.files)Stein.cpp $(Tim.files)Stein.h
    	g++ -c $(Tim.files)Stein.cpp
    

    Mein g++ sagt mir:
    g++ -Wall -o PyramidenBauAlphaV0.5
    g++: no input files
    make: *** [PyramidenBau] Fehler 1

    ich versteh zwar WAS er meint, aber nicht wieso. Weil die Inputfiles müssten doch in der Anweisung "g++ -Wall -o PyramidenBauAlphaV0.5 $(Tim.obj)" mit dem $(Tim.obj) übergeben werden.

    danke für eure Hilfe.



  • Der `:=' ist aus meiner Sicht nicht nötig, stört aber nicht.
    Das Problem ist der Backslash. Er bedeutet (am Zeilenende), wie übrigens auch in Makros, dass der Zeilenumbruch ignoriert werden soll, die nächste Zeile also dazugehört (siehe http://www.gnu.org/software/make/manual/html_node/Splitting-Lines.html).
    Tim.obj existiert bei dir gar nicht und hat gar keinen Wert.

    Die Lösung: Ein Slash /' anstatt ein Backslash\' funktioniert systemunabhängig und verhält sich immer wie erwartet, er hat keine zusätzliche Bedeutung.

    Wenn man sich etwas auskennst, kann man das ganze Makefile so schreiben:

    TARGET   := PyramidenBauAlphaV0.5
    CCFLAGS  := -g -Wextra -Wall -pedantic-errors
    CC       := g++
    OBJECTS  := $(patsubst %.cpp, %.o, $(wildcard *.cpp))
    
    .PHONY: all
    all: $(TARGET)
    
    $(TARGET): $(OBJECTS)
        $(CC) $(CCFLAGS) -o $(TARGET) $(OBJECTS)
    
    $(OBJECTS): %.o: %.cpp
        $(CC) $(CCFLAGS) -c $< -o $@
    

    (ungetestet)
    `-Wall' nützt dir beim Zusammenlinken übrigens nicht mehr so viel.


Anmelden zum Antworten