Wie macht man ein Makefile?
-
-
So sieht meine Makefile-template aus:
#!/usr/bin/make -f # Name der ausführbaren Datei, die erstellt werden soll TARGET = example CXX = g++ # Optionen anpassen, wie du sie brauchst CXXFLAGS = -O2 LIBS = -ldeine_lib DEPFILE = .depend HEADERS = $(wildcard *.h) SRCS = $(wildcard *.cpp) OBJS = $(SRCS:%.cpp=%.o) .PHONY: all dep clean distclean mrproper all: dep $(TARGET) $(TARGET): $(OBJS) $(CXX) $(CXXFLAGS) $(LIBS) $(OBJS) -o $@ dep: $(SRCS) $(HEADERS) $(CXX) -MM $(SRCS) > $(DEPFILE) -include $(DEPFILE) clean: rm -f $(DEPFILE) $(OBJS) distclean: clean rm -f $(TARGET) mrproper: distclean rm -f $(wildcard *~)
-
Für Projekte, die C und C++-Code mischen, sollte das hier ganz gut funktionieren:
#!/usr/bin/make -f TARGET = target CC = gcc CXX = g++ CFLAGS = -O2 CXXFLAGS = -O2 LIBS = DEPFILE = .depend HEADERS = $(wildcard *.h) $(wildcard *.hh) CSRCS = $(wildcard *.c) CXXSRCS = $(wildcard *.cc) SRCS = $(CSRCS) $(CXXSRCS) OBJS = $(CSRCS:%.c=%.o) $(CXXSRCS:%.cc=%.o) .PHONY: all dep clean distclean mrproper all: dep $(TARGET) $(TARGET): $(OBJS) $(CXX) $(LIBS) $(OBJS) -o $@ dep: $(SRCS) $(HEADERS) $(CC) -MM $(SRCS) > $(DEPFILE) -include $(DEPFILE) clean: rm -f $(DEPFILE) $(OBJS) distclean: clean rm -f $(TARGET) mrproper: distclean rm -f $(wildcard *~)
Optionen und Dateiendungen halt nach Notwendigkeit anpassen.
-
Wenn ich das Makefile ein wenig anpasse (also meine Lib hinzufügt& Endungen angepaßt), dann bekomme ich bei "make makefile" die Meldung
make: Nothing to be done for 'makefile'was muß ich denn noch ändern an dem Beispiel von "0xdeadbeef"?
ICh verstehe leider nur einen kleinen Teil es Files. Das Makefile nimmt einfach alle c/cpp/h Files aus dem Verzeichnis und compiliert/linkt sie zusammen?
Was ist denn das Einstiegsclausel für das make um den Compileraufruf zusammenzustückeln? Oder fängt er einfach oben an, also hier bei all?Ich sehe hier leider auch keine -l oder -c eingefügt für die Libs... stimmt das denn so?
*nixblick*
(freue mich schon wieder mit meinem Visual C zu programmieren)
-
make -f makefile
Wäre richtig. Kannst aber auch nur make schreiben denn wenn nichts angegeben wird dann nimmt make automatisch das Makefile oder makefile im gleichen Verzeichnis.
Du hast Recht wenn du kein target angibst wird das erste target verwendet, in dem beispiel also all:
Wenn du libraries dazulinken willst dann muss das ins symbol LIBS
Kurt
-
Dankeschön, das hat mir um einiges weitergeholfen. vorallem das "-f"
jetzt habe ich zwar noch ein paar Andere Probleme, aber die kommen wohl vom portieren
Windows-Intel --> SUN-"wasweißich" *g*
-
Nun habe ich nochmal ein Problem.
Und zwar mag der Compiler auf der Sun "-include $(DEPFILE)" nicht. Auf Linux tut das wunderbar. Wann wird denn das -include ausgeführt? Das ist mir noch nicht ganz klar. Kann ich das auch irgendwie anders schreiben?
Zum Beispiel "-include .depend" irgendwo anhängen? Oder wäre das falsch?
-
Habe aus den bisherigen Beiträgen noch nicht erkennen können ob du GNU-Make verwendest oder ein SUN-Make.
Bei GNU-Make bedeutet-include $(DEPFILE)
includiere $(DEPFILE) und ignoriere das include ohne Fehlermeldung wenn $(DEPFILE) nicht existiert ( wegen dem vorangestellten - ) Könnte eine GNU-Make Erweiterung sein.
Versuchs mal ohne -
Kurt
-
Sobald dein projekt größer wird würde ich aber auf die autotools (automake/autoconf) zurückgreifen.
-
Oder (falls du python kannst) scons (http://www.scons.org/)
-
Ich empfehle dir bakefile. Ist leicht zu lernen ( 10-20minuten) und kann Makefiles für sehr viele Compiler erstellen Darunter VC, GCC, MinGW-gcc, Borland ect.
rya.
Scorcher24
-
-
hmm.. eigentlich wollte ich nur dieses eine mal ein makefile benutzen und dann nie wieder
Das blöde ist eben, daß das Makefile bei Linux tut, aber auf der Sun nicht. Da bekomme ich bei der Zeile "-Include..."
den Fehler "make: Fatal error in reader: makefile2.txt, line 28: Unexpected end of line seen"So wie ich das sehe ist das auch ein Make von SunOS. Ganz ehrlich würde ich das ganze auch ohne make machen wenn ich wüßte wie. Inzwischen habe ich die ib rausgeschmissen und mich auf das nötigste beschrängt. Also 3 CPP und 2 H-Files. Die müßte ich in Abhängigkeit zueinander mit g++ compilieren. Das kann doch nicht so schwer sein, oder doch? Ich kenne leider die Optionen von g++ nicht und in der man rumscrollen bringt mich auhcnicht weiter
-
Also normal sollte es der aufruf von
g++ file1.cpp file2.cpp file3.cpp -o out
tun.
Du solltest dann noch mit "-I(..)" die includePfade und mit "-l" die Bibliotheken linken falls du welche brauchst. Die Reihenfolge der cpp Dateien ist eigentlich egal, da die Symbole später vom Linker zusammengesucht werde. Die includes müssen dann halt stimmen.
Was für Fehler bekommst du denn ??
rya.
Scorcher24
-
hi,
das ganze wird dann kompiliert und ich bekomme eine undefined reference to "alaw2linear" er findet also die Funktionen nicht. Diese Funktionen sind in einer .c definert, bzw. in einer .H deklariert und zwar als extern "C" Funktionen. Also klappt da wohl beim Linken was nicht
-
Naja, die Dateien musst du zum Projekt hinzufügen. Oder wenn du eine lib hast, halt die die library. Dann sollte der Linkerfehler verschwinden.
Wozu gehört denn diese ominöse Datei ??rya.
Scorcher24
-
wie meinst du das mit "zum Projekt hinzufügen"? Ich hab doch bei g++ kein Projekt in dem Sinn oder? In den anderen cpp Files werden alle h's Includiert. Aber das reicht ja anscheinend nicht.
Wozu die Datei gehört?? Das sind Funktionen die ich früher mal in C programmiert habe und die ich jetzt in meinem cpp Programm einbinden will.
-
Wenn du eine Funktion in einem Programm verwendest, musst du dem compiler sagen, wo er die symbole dazu findet. Das einfachste ist, die Datei mitzulinken. Also nimm den gcc aufruf von vorhin und füg die Datei einfach an. Dann sollte dieses unbefriedigte Symbol verschwinden.
rya.
Scorcher24edit: Mir geht ein Licht auf:
Wenn du zu der .c Datei einen Header hast, schreib mal extern"C" über die Deklarierung, bzw. deklarier mal die Datei so in einer .cpp Datei:extern "C" void foo();
Man kann sich alternativ ein Makro basteln:
#ifdef _clpusplus #define EXTERN_C extern "C" #endif
-
Die Fehlermeldungen von vorher sind dann weg. Dafür bekomme ich dann
file not recognized: File format not recognized
collect2: ld returned 1 exit statusirgendwas gefällt dem Compiler an dem File nicht.
Naja vielleicht ist #ifndef... und extern int... nicht ANSI-Konform und das muß es auf der SUN sein???keine Ahnung.
Aber das ärgert mich echtWieso muß der scheiß g++ Compiler und das make auf Linux anders reagieren als auf einer Sun.
-
Du hast geschrieben dass du eine Lib verwendest.
Woher stammt die ?? Ist die nativ von Linux?? Wenn Sie zu Solaris oder Windows gehört kannstes vergessen, weil jedes OS seine eigenen Symbole und auch ne andere Methode verwendet um Librarys, bzw dlls anzulegen.
rya.
Scorcher24