[Help] makefile schreiben!
-
Hallo zusammen,
Ich bin gerade an einer Aufgabe dran die sich mit makefiles beschäftigt (stammt aus einem Buch leider ohne Lösung) und das "Wissen" das ich mir darüber angelesen habe lässt mich nicht verstehen wie das ganze aufgebaut werden muss, habe mir auch schon bei gnu.org die manuals zu make durchgelesen, aber ich blick da nicht durch.
Hoffe ihr könnt mir bei folgender Aufgabe weiterhelfen:Ihr cpp-Projekt enthält folgende SourceFiles mit entsprechenden Abhängigkeiten:
a.cpp -> a.h -> b.h -> c.h
b.cpp -> b.h
c.cpp -> c.h ->b.hSchreiben Sie für diese Projekt ein makefile, das folgende Funktionalitäten übernimmt:
make all -> compilieren, linken zur Applikation testabc.exe,installieren der testabc.exe in /usr/bin
make build -> compilieren und linken zur Applikation testabc.exe
make install -> installieren der testabc.exe in /usr/bin
make clean -> entfernen aller ObjectFiles und der testabc.exe
Leider find ich nirgends Beispiele an denen ich mich orientieren könnte, deshalb wär ich sehr dankbar, wenn jmd. mir bei der Erstellung helfen würde.
Vielen Dank schonmal!!!
-
Hier, sollte dir einen Ansatz geben.
http://www.emba.uvm.edu/~snapp/make.html
-
und hier...
-
svenb schrieb:
Ihr cpp-Projekt enthält folgende SourceFiles mit entsprechenden Abhängigkeiten:
a.cpp -> a.h -> b.h -> c.hok. die schreiben wir mal als regel in das makefile. wobei ich annehme, daß eigentlich nur gemeint ist, daß a.cpp diese drei headers inkludiert.
a.o: a.cpp a.h b.h c.hdas bedeutet jetzt: wenn sich a.h oder b.h oder c.h oder a.cpp geändert haben, dann muß die a.o neugemacht werden. und sie muß auch gemacht werden, wenn es sie noch gar nicht gab.
[/quote]
b.cpp -> b.h
c.cpp -> c.h ->b.h[/quote]b.o: b.cpp b.h
c.o: c.cpp c.h b.h[quote]Schreiben Sie für diese Projekt ein makefile, das folgende Funktionalitäten übernimmt:
...a.o: a.cpp a.h b.h c.h b.o: b.cpp b.h c.o: c.cpp c.h b.h testabc.exe: a.o b.o c.o all: testabc.exe install install: testabc.exe cp testabc.exe /usr/bin/ clean: rm *.o testabc.exenach der install-regel steht noch ne zeile. so sieht allgemein eine regel aus. in der ersten zeile vor dem doppelpunkt, was das ergebnis ist und nach dem doppelpunkt, was die eingangsdaten sind. in den folgenden zeilen, die je mit einem tab anfangen MÜSSEN, stehen die befehle, die dazu notwendig sind.
manche befehle braucht man nicht anzugeben, wie die von *.cpp nach *.o, weil sie in make eingebaut sind. kannst sie aber auch gerne aneben.a.o: a.cpp a.h b.h c.h g++ a.cpp -o a.o b.o: b.cpp b.h g++ b.cpp -o b.o c.o: c.cpp c.h b.h g++ c.cpp -o c.o testabc.exe: a.o b.o c.o all: testabc.exe install install: testabc.exe cp testabc.exe /usr/bin/ clean: rm *.o testabc.exebesser sind aber makefiles, die sowas alles ganz automatisch machen, weil man dann nich immer am makefile anpassungen machen muss, wenn man am sourcecode was ändert. ich verwende zur zeit auf win und linux das hier:
# Volkards universal makefile # (c) 1999-2005 volkard@normannia.de # feel free to use it in any ways. #CXXFLAGS:=-Wall -Werror -march=i586 -O3 -fno-rtti -pipe -s -DUNITTEST CXXFLAGS:=-Wall -Werror -march=i586 -O3 -fno-rtti -pipe -s -DNDEBUG PROJECT:=$(basename $(notdir $(CURDIR))) TARGET_EXT:= ifeq ($(OS),Windows_NT) TARGET_EXT:=.exe endif TARGET:=$(PROJECT)$(TARGET_EXT) zip:=$(PROJECT).rar headers:=$(wildcard *.h) sources:=$(wildcard *.cpp) missingSources:=$(filter-out $(sources),$(headers:.h=.cpp)) objects:=$(sources:.cpp=.o) deps:=$(sources:.cpp=.d) $(missingSources:.cpp=.d) all: $(missingSources) $(TARGET) ifneq ($(MAKECMDGOALS),clean) -include $(deps) endif .PHONY: all clean run zip create $(TARGET): $(deps) $(objects) $(CXX) $(CXXFLAGS) -o $(TARGET) $(objects) %.o %.d: %.cpp $(CXX) $(CXXFLAGS) -MMD -c $< $(missingSources): %.cpp: %.h echo #include "$<" > $@ clean: -$(RM) $(TARGET) $(objects) $(deps) run: $(TARGET) ./$(TARGET) zip: -$(RM) $(zip) rar a -r -s -m5 -ap$(PROJECT) $(zip) *.cpp *.h makefile
-
Vielen Dank!!!
Wo genau kommen denn die file namen hin? also a.cpp b.cpp usw.und deren Abhängigkeiten?
ich hab hier leider nur makefiles die mit Dev-Cpp für Windows erstellt wurden, soll aber für Linux laufen.
Desweiteren hab ich noch solche makefiles:all: Fahrzeugverwaltung.exe Fahrzeugverwaltung.exe: Fuhrpark.o Fahrzeuge.o LKW.o PKW.o main.o Fahrzeugverwaltung.o Menu/Menu.o Menu/MenuItem.o CallbackFahrzeugver.o g++ -pedantic -Wall -o Fahrzeugverwaltung.exe Fuhrpark.o Fahrzeuge.o LKW.o PKW.o main.o Fahrzeugverwaltung.o Menu/Menu.o Menu/MenuItem.o CallbackFahrzeugver.o Fuhrpark.o: Fuhrpark.cpp Fuhrpark.h Fahrzeuge.h LKW.h PKW.h g++ -pedantic -Wall -c Fuhrpark.cpp CallbackFahrzeugver.o: CallbackFahrzeugver.cpp CallbackFahrzeugver.h Menu/MenuReturn.h Fahrzeuge.h LKW.h PKW.cpp Fuhrpark.h g++ -pedantic -Wall -c CallbackFahrzeugver.cpp Fahrzeuge.o: Fahrzeuge.cpp Fahrzeuge.h g++ -pedantic -Wall -c Fahrzeuge.cpp main.o: main.cpp Fahrzeugverwaltung.h Menu/Menu.h Menu/MenuReturn.h g++ -pedantic -Wall -c main.cpp LKW.o: LKW.cpp LKW.h Fahrzeuge.h g++ -pedantic -Wall -c LKW.cpp PKW.o: PKW.cpp PKW.h Fahrzeuge.h g++ -pedantic -Wall -c PKW.cpp Menu.o: Menu/Menu.cpp Menu/Menu.h g++ -pedantic -Wall -c Menu/Menu.cpp MenuItem.o: Menu/MenuItem.cpp Menu/MenuItem.h g++ -pedantic -Wall -c Menu/MenuItem.cpp Fahrzeugverwaltung.o: Fahrzeugverwaltung.cpp Fahrzeugverwaltung.h Menu/MenuItem.h Menu/Menu.h Menu/MenuReturn.h Fuhrpark.h CallbackFahrzeugver.h g++ -pedantic -Wall -c Fahrzeugverwaltung.cpp clear: rm *.o rm Menu/*.o rm Fahrzeugverwaltung.exeSieht aber nicht wirklich professionell wie die Volkards Version aus, deshalb hoffe ich auf Hilfe wo die ganzen Sachen hinkommen.
Danke nochmal!!!