C Makefile Linux 2 Programme erstellen

hell-student

Lieutenant
Registriert
Nov. 2007
Beiträge
671
Hallo Zusammen,

ich habe mir eine kleine Makefile erstellt um einfacher arbeiten zu können, brauche nun aber mehrere Programme und bekomme das einfach nicht hin.

So sieht meine Makefile momentan aus:

Code:
prog_a: globals.o prog_a.o
	gcc -o prog_a globals.c prog_a.c
	

globals.o: globals.c globals.h
	gcc -c globals.c

prog_a.o: prog_a.c prog_a.h
	gcc -c prog_a.c

Wie kann ich jetzt noch Programm prog_b dort einfügen, wenn dies beispielsweise von globals_b abhängt? Oder muss ich eine seperate Datei machen bzw. kann ich das irgendwie mit Variablen machen in der makefile?


Code:
prog_a: globals.o prog_a.o
	gcc -o prog_a globals.c prog_a.c
	

globals.o: globals.c globals.h
	gcc -c globals.c

prog_a.o: prog_a.c prog_a.h
	gcc -c prog_a.c

prog_b: globals_b.o prog_b.o
	gcc -o prog_a globals_b.c prog_b.c
	
globals_b.o: globals_b.c globals_b.h
	gcc -c globals_b.c

prog_b.o: prog_b.c prog_b.h
	gcc -c prog_b.c

Wenn ich das so mache, baut und linkt er nur prog_a und meldet das dies aktuell ist, auch wenn ich prog_b.c verändere.

Hatte irgendwie nie mit makefiles arbeiten müssen, daher hab ich keine Ahnung von. thx

//Edit

habs selbst gelöst. make prog_a und make prog_b löst das Problem
 
Zuletzt bearbeitet: (Lösung)
Code:
all: prog_a prog_b
    
global.o: global.h global.c
	gcc -o global.o -c global.c
    
main_a.o: main_a.c
	gcc -o main_a.o -c main_a.c
    
main_b.o: main_b.c
	gcc -o main_b.o -c main_b.c
    
prog_a: main_a.o global.o
	gcc -o prog_a main_a.o global.o
    
prog_b: main_b.o global.o
	gcc -o prog_b main_b.o global.o

Wenn du noch ein all wie in meinem Beispiel dazu nimmst, reicht wieder ein einfaches "make".
 
@Cry & Die Thx, hat wunderbar funktioniert
 
Hi.

Mal noch ein paar sinnvolle Änderungen:

Code:
.PHONY: all clean

all: prog_a prog_b

clean:
	rm -f global.o main_a.o main_b.o prog_a prog_b

prog_a: main_a.o global.o
	$(CC) $(CFLAGS) -o $@ $< $(LDFLAGS)

prog_b: main_b.o global.o
	$(CC) $(CFLAGS) -o $@ $< $(LDFLAGS)

.PHONY sagt, dass "all" (und "clean") kein real-existierendes Target im Filesystem ist und auch nicht veralten kann. Läge eine Datei namens "all" im Build-Verzeichnis, würde make nix tun ohne PHONY target.

Ein "clean" Target, das den Build "sauber" macht, ist immer gut.

Du siehst, dass die .c-Files fehlen. Hier benutzt make seine internen Regeln - make weiß von sich aus, wie man aus einem .c-File ein .o-File macht, indem es den Compiler aus der Umgebungsvariable $(CC) benutzt (oder den Plattform-Compiler, wenn CC nicht gesetzt ist).

Die Regel für prog_a ist etwas komplizierter, aber nicht schlimm:
Da main_a.o und global.o Abhängigkeiten für das Target sind, werden diese automatisch nach den internen Regeln für .o Targets gebaut.

$(CFLAGS) sind die üblichen Compiler-Flags - jedes Makefile sollte sie respektieren.

$@ ist der Name des aktuellen Targets, also prog_a.
$< ist die Liste aller Abhängigkeiten des aktuellen Targets, also main_a.o und global.o.
$(LDFLAGS) sind die üblichen Flags für den Linker, hier wird schließlich ein Executable gelinkt. Auch diese Umgebungsvariable sollte man respektieren in einem sauberen Makefile.

Wenn man das also auflöst, steht das gleiche wie vorher da, nur allgemeiner und kompakter. :) Das geht noch extrem viel kompakter, aber für den Anfang ist das denke ich ein guter Einstieg in die erweiterten Fähigkeiten von make.

Ein nettes, weiterführendes Tutorial findest du hier:
http://www.ijon.de/comp/tutorials/makefile.html

Hope this helps
 
@7H3 N4C3R

Danke für die Hilfe. Ich habe aber folgens Problem:

Code:
.PHONY: all clean

all: task arbiter runtime_system

clean:
	rm -f globals.o runtime_system.o arbiter.o task.o runtime_system arbiter task

task: globals.o
	$(CC) $(CFLAGS) -o $@ $< $(LDFLAGS)
	
runtime_system: globals.o
	$(CC) $(CFLAGS) -o $@ $< $(LDFLAGS)
	
arbiter: globals.o
	$(CC) $(CFLAGS) -o $@ $< $(LDFLAGS)

So sieht momentan meine Makefile aus. Eigentlich müsste das doch so gehen. Was ich nicht so ganz verstanden habe sind die mains bei dir bzw. meckert er bei mir gerade das er kein main finden kann:

make all
cc -o task globals.o
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: ld gab 1 als Ende-Status zurück

Muss ich die main irgendwie dazuangeben oder warum findet er dir nicht?
 
Zurück
Oben