Hilfe zum Makefile

Gayson

Mitglied
Hilfe zum Makefile

Hallo!

Ich sollte für die Uni eine kleine, vereinfachte Freispeicherverwaltung in C schreiben ( void* allocate(): Gibt Pointer auf freien Speicher zurück; void deallocate(void* p): gibt Speicher an p frei). Da es mein erstes C-Programm ist, habe ich Problem beim Erstellen des Makefiles. Hier zunächst die "Dateiabhängigkeiten":

allocate.c:
#include "arena.h"
#include "allocate.h"

arena.c:
#include "arena.h"

testapp.c:
#include "allocate.h"

Die allocate.c und allocate.h habe ich selber geschrieben.
Auch wurde uns schon ein Makefile, was wahrscheinlich unvollständig ist, mitgegeben:
Code:
libarena.a:	arena.o
	ar rcs $@ $<

arena.o:	arena.h

clean:
	rm -f arena.o libarena.a
Die Aufgabenstellung enthielt diese Voraussetzungen:
Senden Sie Ihre Lösung in Form eines einzelen gzip-komprimierten Tarfiles ein. Dieses sollte im Wurzelverzeichnis ein Makefile haben, mit zwei Zielen "liballocate.a" und "testapp" (basierend auf testapp.c). Gehen Sie in Ihrer Lösung davon aus, dass die Makefile-Variable LIBARENA das Verzeichnis angibt, in dem sich libarena.a und arena.h befinden.

Meine Überlegungen für das Makefile waren diese, was jedoch nicht klappte:
Code:
LIBS=L. -larena

testapp: testapp.o libarena.a
   cc -Wall -o testapp testapp.o ${LIBS}

libarena.a: arena.o allocate.o
   ar rcs libarena.a arena.o allocate.o

arena.o: arena.h

allocate.o: allocate.h

clean:
   rm -f testapp *.o *.a
Könnt ihr mir helfen, wie das Makefile aussehen müsste?
Danke!
 
Zuletzt bearbeitet:
google mal nach Makefiles!
Du kannst bei Makefiles Variablen benutzen. Beim gcc z.B. CC oder CFLAGS.
u.a. machst du den Fehler, dass du die object-files nicht erstellst
also z.B.:

arena.o: arena.c
$(CC) $(CFLAGS) -c arena.c
 
Also dein Ansatz war schon mal ganz gut nur solltest du zunächst mal wissen wie ein Makefile aufgebaut ist:
Code:
# hier mal ein beispiel
# zu nächst kommt der Variablenbereich
CC=gcc
LD=gcc
CCFLAGS=-w
# usw.

# dann kommen die targets (ziele) mit ihren Abhängigkeiten

target_1: dep1
   tu dies und das

dep1: dep2
   tu jenes

dep2:
   tu dieses
Das ist mal ein Grundaufbau.

Daniel
 
Mahlzeit!

Ich habe auch ein Problem bzgl. Makefiles und zwar habe ich eines bekommen und soll es kompilieren. (VC6.0)
Also habe ich Datei -> Arbeitsberech öffnen... -> win32.mak gemacht. Dann wollte ich es kompilieren und bekomme Fehler, dass := nicht erlaubt ist, und Dateien nicht gefunden werden können.

Was kann ich tun, damit es funktioniert?
Hab ich vielleicht etwas völlig falsch gemacht?
 
Bei manchen make-Versionen ist das Erweitern von Variablen mit := nicht erlaubt. Da muß man sie immer im Ganzen setzen. Das kann auch daran schuld sein, daß Dateien nicht gefunden werden, wenn sie durch mit := erzeugte Variablen beschrieben werden. Sonst schau mal nach, ob die Dateipfade mit '/' oder '\' zusammengesetzt sind. Unter Windows solltest Du immer '\' verwenden, es sei denn, ein Tool verlangt ausdrücklich '/'. Mit
Code:
$(subst /,\,$(PFAD))
kannst Du alle '/' in der Variablen PFAD in '\' tauschen. Falls du Dir nicht sicher bist, wie der Dateipfad aussieht, kannst Du ihn Dir ja erstmal mit
Code:
echo $(PFAD)
oder
Code:
$shell(echo $(PFAD))
ausgeben lassen.
 
Zurück