C, Bibliotheken, gcc und Makefiles

Hallo zusammen, ich soll für eine Übung ein Programm zur Freispeicherverwaltung in C schreiben. Das habe ich auch schon getan, es funktioniert ich verstehe nur noch nicht warum :wink:
Deshalb hoffe ich, dass ihr mir helfen könnte ein paar Verständnisprobleme aus der Welt zu schaffen.
Also wir haben zwei Dateien arena.c und arena.h zur Verfügung, sowie ein Makefile, was daraus eine Bibliothek libarena.a macht.
Ich poste den Inhalt mal:

arena.h:

#ifndef _ARENA_H
#define _ARENA_H
#define BLOCKSIZE 40
#define NUM_BLOCKS 1024
extern unsigned char arena[BLOCKSIZE*NUM_BLOCKS];
extern unsigned short allocated_map[NUM_BLOCKS/16];
#endif

arena.c:

#include „arena.h“
unsigned char arena[BLOCKSIZE*NUM_BLOCKS] = {};
unsigned short allocated_map[NUM_BLOCKS/16] = {};

Dann habe ich folgende Files geschrieben:

allocate.h

void* allocate();
void deallocate(void *data);

allocate.c:

#include"allocate.h"
#include
void* allocate(void){…}
void deallocate(void *data){…}

Ich habe jetzt die Implementierung in der allocate.c weggelassen, aber ich greife da auf die Variablen und Arrays aus arena.h/.c zu.
Hier tauchen bei mir schon die ersten fragen auf:

  1. Warum reicht es arena.h zu includen?

Erst in arena.c wird das ja mit Nullen initialisiert, in allocated.c nutze ich aber schon den Umstand, dass das Array am Anfang nur Nullen enthält…
Naja, solange es funktioniert solls mir recht sein.
Wir haben eine testapp.c, die ein paar Speicherblöcke alloziert und dealloziert, funktioniert alles.
Also widme ich mich wieder der Aufgabe, nämlich ein Makefile zu erstellen, das eine Bibliothek liballocate.a und eine testapp (auf basis der testapp.c) erstellt. Die sieht bei mir so aus:

LIBARENA = .
testapp: liballocate.a testapp.o $(LIBARENA)/libarena.a
gcc -o testapp testapp.o allocate.o -L $(LIBARENA) -l arena
liballocate.a: allocate.o
ar rcs $@ $

Die Variable LIBARENA gibt den Pfad an, an dem sich arena.h, arena.c, und das Makefile für die libarena.a (NICHT die liballocate.a!) befinden, wir solln einfach davon ausgehen, dass die vorhanden sind.
Fangen wir mal mit dem allocate.o an:
gcc -c allocate.c -I $(LIBARENA)
Mit -I geb ich den Pfad an, an dem ich den Headerfile finde, richtig verstanden? Aber

  1. Warum kann ich da nicht einfach schon die libarena.a benutzen?

Ok, dann die testapp, hier hörts dann auf mit meinem Verständnis =(

testapp: liballocate.a testapp.o $(LIBARENA)/libarena.a
gcc -o testapp testapp.o allocate.o -L $(LIBARENA) -l arena

Mit -L geb ich den Pfad an, an dem Bibliotheken zu finden sind, mit -l geb ich die dan konkret an, richtig?
Aber auch hier:

  1. Warum kann ich nicht direkt die liballocate.a und libarena.a benutzen?

Ich habe schon alle möglichen Kombinationen ausprobiert, aber irgendwie… auf diese Lösung bin ich jetzt mehr oder weniger zufällig gekommen^^ Ich hatte einen Tip von nem Kommilitonen bekommen und habe danach so lange probiert bis es geklappt hat :wink:

Ich würde mich freuenm, wenn ihr ein paar Idenn habt
LG
elactic

Ich habe nochmal ein wenig mehr gelesen und bin auf etwas gestoßen, was mir die meisten Fragen beantwortet hat :wink: