make

Pascal, Basic und andere nicht aufgelistete
Antworten
MoonGuy
Beiträge: 231
Registriert: Fr Okt 08, 2010 2:49 pm

make

Beitrag von MoonGuy » Di Jan 11, 2011 6:01 pm

Hi, mal wieder von mir.
Keine wirkliche Programmiersprache, aber ich habe ein Problem mit make.

Und zwar habe ich eine Makefile erstellt, und wenn ich make all oder make clean benutze, dann bekomme ich folgenden Fehler, nachdem alle *.o Dateien erstellt wurden:
make: cleangame: Command not found
bzw.
make: game: Command not found

Error 127

Woran kann das liegen, ich meine, es gibt ja die Targets game und cleanmgame. Es ging auch eine Zeit lang, doch als ich den Ordner mal komplett verschoben hatte, ging es nichtmehr. Auch zurückschieben half nicht. Was mich wundert ist, dass make game oder make cleangame funktionieren, wenn sie direkt als target vom Befehl aus angsteuert werden.

Makefile:

Code: Alles auswählen


CC = g++
CFLAGS = sdl-config  --libs
LDFLAGS = -lSDL -lSDL_image -lSDL_ttf

OBJ_GAME = game/src/main.o game/src/init.o game/src/events.o
BIN_GAME = mygame

.PHONY: all \
	game \
	clean \
	cleangame



all: $(OBJ_GAME)
	@game
	@cleangame

game: $(OBJ_GAME)
	$(CC) -o $(BIN_GAME) $(OBJ_GAME) `$(CFLAGS)` $(LDFLAGS)

clean:
	@cleangame

cleangame:
	@echo "removing game objects and binaries";
	rm -rf $(BIN_GAME) $(OBJ_GAME)

hofian
Beiträge: 62
Registriert: Do Sep 24, 2009 6:59 pm

Re: make

Beitrag von hofian » Di Jan 11, 2011 7:16 pm

Hi!

Eigentlich ganz einfach:

Code: Alles auswählen

all: $(OBJ_GAME)
   @game
   @cleangame
Ich vermute mal du möchtest, dass beim Aufruf von make all erst das Target game und dann das Target cleangame erledigt werden soll.

Auf "Makesprache" heißt das: Die Targets game und cleangame sind Abhängigkeiten von all. So wie du das schreibst, ruft man Shell-Befehle auf, zum Bespiel echo oder gcc. Allerdings glaube ich wohl kaum, dass in deinem System die Programme game und cleangame vorhanden sind. Das merkt auch make, was dann zum Fehler 127 führt: Command not found.

Lösen lässt sich das Problem ganz einfach :) :

Code: Alles auswählen

all: game cleangame
Wobei mir gerade auffällt, dass das Makefile auch noch an ein paar anderen Stellen "Schwächen" aufweist:

Code: Alles auswählen

CFLAGS = sdl-config  --libs
CFLAGS bestimmt C Compiler Optionen, zum Beispiel Include Verzeichnisse für den C-Compiler. Du benutzt g++, also schreibst du wahrscheinlich auch in C++. Hier benutzt man üblicherweise CXXFLAGS. Außerdem liefert `sdl-config --libs` die benötigten Libraries (das gehört zu LDFLAGS). Bei CXXFLAGS schreibst du besser:

Code: Alles auswählen

CXXFLAGS = `sdl-config --cflags`
Diese Häkchen kennzeichnen den Shell-Befehl, der hier dahinter steckt. Du brauchst sie in Makefile nur bei Zuweisungen.
Wenn du überhaubt `sdl-config --libs` einsetzen willst, dann bei LDFLAGS. Allerdings sagt mir die Ausgabe des Befehls im Terminal, dass deine Ausführungen es ebenso gut tun:

Code: Alles auswählen

max@clt:~$ sdl-config --libs
-L/usr/lib -lSDL
Mit allen (von mir vorgeschlagenen) Korrekturen würde dein Makefile dann so aussehen, ich hoffe mal jetzt ohne Fehler (ungetestet):

Code: Alles auswählen

CC = g++
CXXFLAGS = `sdl-config  --cflags`
LDFLAGS = -lSDL -lSDL_image -lSDL_ttf

OBJ_GAME = game/src/main.o game/src/init.o game/src/events.o
BIN_GAME = mygame

.PHONY: all \
   game \
   clean \
   cleangame



all: game cleangame

game: $(OBJ_GAME)
   $(CC) -o $(BIN_GAME) $(OBJ_GAME) $(CXXFLAGS) $(LDFLAGS)

clean: cleangame

cleangame:
   @echo "removing game objects and binaries";
   rm -rf $(BIN_GAME) $(OBJ_GAME)
Obwohl du dir so make clean schenken könntest... ;)

Für weitere Fragen zu Make empfehle ich dir Xin's Make-Tutorial. Unter anderem solltest du dir mal Pattern-Regeln anschauen, um dein Makefile noch effektiver und automatisierter zu machen.

MoonGuy
Beiträge: 231
Registriert: Fr Okt 08, 2010 2:49 pm

Re: make

Beitrag von MoonGuy » Mi Jan 12, 2011 7:27 pm

Danke für die Antwort, die Makefile funktioniert nun, doch er sagt mir:

Code: Alles auswählen

cannot open output file -L/usr/lib: No such file or directory
Woran kann das liegen, ich besitze das Verzeichnis /usr/lib/, immerhin liegen dort alle meine libraries.

€dit: Problem erkannt, falsche Zeile in den Compiler gehauen und ausversehen die main.cpp gelöscht, deshalb auch undefined reference to __main.

Antworten