Makefile erstellen



  • Ich möchte für ein Spiel in C++/SDL geschrieben ein Makefile erstellen.

    Mein erster Versuch:

    Datei: erstellen

    CC = /user/bin/g++
    CFLAGS = 
    LDFLAGS = `sdl-config --cflags --libs` -lSDL -lSDLmain
    
    OBJ = *.cpp
    
    SDL_Game/SDL_Game: $(OBJ)
    	$(CC) -o SDL_Game/SDL_Game $(LDFLAGS)
    

    Befehl im Terminal: make erstellen
    Fehlermeldung: make: Für das Ziel »erstellen« ist nichts zu tun.

    Im Terminal übersetze ich das Spiel mit: g++ -o SDL_Game/SDL_Game `sdl-config --cflags --libs` -lSDL -lSDLmain *.cpp

    Mein Makefile müsste doch auch in etwa dem entsprechen... Oder?



  • CC = /user/bin/g++
    CFLAGS =
    LDFLAGS = `sdl-config --cflags --libs` -lSDL -lSDLmain
    
    OBJ = *.cpp
    erstellen: $(OBJ)
        $(CC) -o SDL_Game/SDL_Game $(LDFLAGS)
    


  • Fehlermeldung bleibt die gleiche.



  • Wenn dein Makefile "erstellen" heißt, rufst du es mit

    make -f erstellen

    auf.



  • Mit 'make -f erstellen' kommt als Fehlermeldung: make: >>SDL_Game<< ist bereits aktualisiert.



  • Dieser Thread wurde von Moderator/in Phoemuex aus dem Forum C++ in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Das ist keine Fehlermeldung, sondern signalisiert nur, dass SDL_Game nicht akualisiert werden muss.

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-88418.html



  • passt dieses allgemeine Makefile auch für C?



  • Erhard Henkes schrieb:

    passt dieses allgemeine Makefile auch für C?

    Mit ein paar kleinen Anpassungen passt es auch für C oder Fortran oder was auch immer einen ähnlichen Kompilierporzess hat.



  • Ich habe jetzt mal mein makefile etwas veränder.

    makefile:

    CC=/usr/bin/g++
    CFLAGS=-I/usr/include/SDL
    LDFLAGS=`sdl-config --cflags --libs`
    OBJ=Asteroid.o Framework.o Game.o main.o Player.o Shot.o Sprite.o Timer.o
    TARGET=SDL_Game/SDL_Game
    
    Asteroid.o:Asteroid.cpp Asteroid.hpp Sprite.hpp
    	$(CC) -o $@ $(CFLAGS) -c Asteroid.cpp
    
    Framework.o:Framework.cpp Framework.hpp Singleton.hpp Timer.hpp
    	$(CC) -o $@ $(CFLAGS) -c Framework.cpp
    
    Game.o:Game.cpp Game.hpp Player.hpp Asteroid.hpp
    	$(CC) -o $@ $(CFLAGS) -c Game.cpp
    
    main.o:main.cpp Framework.hpp Game.hpp
    
    Player.o:Player.cpp Player.hpp Sprite.hpp Shot.hpp
    	$(CC) -o $@ $(CFLAGS) -c Player.cpp
    
    Shot.o:Shot.cpp Shot.hpp Sprite.hpp
    	$(CC) -o $@ $(CFLAGS) -c Shot.cpp
    
    Sprite.o:Sprite.cpp Sprite.hpp Framework.hpp
    	$(CC) -o $@ $(CFLAGS) -c Sprite.cpp
    
    Timer.o:Timer.cpp Timer.hpp Singleton.hpp
    	$(CC) -o $@ $(CFLAGS) -c Timer.cpp
    
    $(TARGET):$(OBJ)
    	$(CC) -o $@ $(LDFLAGS) $(OBJ)
    
    all:$(OBJ)
    

    Jetzt wird nur noch 'Asteroid.o' ubersetzt.
    Alles andere wird übergangen.
    Woran kann das liegen?



  • ugoessner schrieb:

    Jetzt wird nur noch 'Asteroid.o' ubersetzt.
    Alles andere wird übergangen.
    Woran kann das liegen?

    Das liegt daran, dass Du es Dir das mit dem Makefile zu kompliziert machst. Warum machst Du es nicht einfach so "idiotensicher" und wie eine Batch-Datei:

    CC = /usr/bin/g++
    CFLAGS = -I/usr/include/SDL
    LDFLAGS = `sdl-config --cflags --libs`
    
    all:
        $(CC) -o Asteroid.o -c Asteroid.cpp $(CFLAGS)
        $(CC) -o Framework.o -c Framework.cpp $(CFLAGS)
        $(CC) -o Game.o -c Game.cpp $(CFLAGS)
        $(CC) -o Player.o -c Player.cpp $(CFLAGS)
        $(CC) -o Shot.o -c Shot.cpp $(CFLAGS)
        $(CC) -o Sprite.o -c Sprite.cpp $(CFLAGS)
        $(CC) -o Timer.o -c Timer.cpp $(CFLAGS)
        $(CC) Asteroid.o Framework.o Game.o Player.o Shot.o Sprite.o Timer.o -o main $(LDFLAGS)
        @echo Ende! Keine Fehler! Fertig!
    

    Dann sagst Du einfach:

    > make
    

    Oder, wenn Dich die vielen Ausgaben stören:

    > make -s
    

    Und das wars. 😕



  • Bei main.o hast du die Anweisung vergessen!

    Aber Probier lieber die Makefile aus der FAQ aus. Die ist besser, als deine Makefile (u.a. macht die das mit den Headerabhängigkeiten von selbst und du musst die Makefile nicht für jede neue Codedatei manuell anpassen!)

    abc.w schrieb:

    Das liegt daran, dass Du es Dir das mit dem Makefile zu kompliziert machst. Warum machst Du es nicht einfach so "idiotensicher" und wie eine Batch-Datei:

    👎
    Weil dann alles immer neu kompiliert wird. Das ist natürlich sehr ineffizient. Daher macht man es eben genauso nicht!



  • rüdiger schrieb:

    👎
    Weil dann alles immer neu kompiliert wird. Das ist natürlich sehr ineffizient. Daher macht man es eben genauso nicht!

    Sicher ist sicher und für dieses Vorhaben völlig ausreichend und

    rüdiger schrieb:

    Bei main.o hast du die Anweisung vergessen!

    man sieht gleich, dass man etwas falsch gemacht hat 😉



  • abc.w schrieb:

    rüdiger schrieb:

    👎
    Weil dann alles immer neu kompiliert wird. Das ist natürlich sehr ineffizient. Daher macht man es eben genauso nicht!

    Sicher ist sicher und für dieses Vorhaben völlig ausreichend und

    Nein, dein Vorschlag ist nicht sicher und auch nicht ausreichend. Daher sollte er lieber die fertige Makefile aus der FAQ nehmen.

    abc.w schrieb:

    rüdiger schrieb:

    Bei main.o hast du die Anweisung vergessen!

    man sieht gleich, dass man etwas falsch gemacht hat 😉

    Bei deiner Form sieht man es doch erst recht nicht, ob man etwas vergessen hat. Du hast main.o zB komplett vergessen.


Anmelden zum Antworten