Wie macht man ein Makefile?



  • Hallo, ich würde gerne wissen wie man ein makefile macht. Aus dem Manuel von make werde ich leider nicht schlau und viel einbinden müßte ich ja eigentlich auch nicht.

    ich habe:

    - 1 c-File
    - 2 cpp-files
    - 5 h-Files
    - 1 Lib oder dll

    wie binde ich das nun alles in das Makefile ein, damit alles compiliert und richtig gelingt wird???
    kann mir da jemand helfen? Wäre super

    danke gruß

    P.s.: hoffe ich bin im richtigen Bereich, paßt nicht 100%ig aber hab keinen Besseren gesehen.





  • naja wirklich viel bringt mich das auchnicht weiter. Da findet man meistens viel zu viel Infos und wie ich eine Lib einbinde finde ich irgendwie garnicht. Oder ich sehe vor lauter Bäumen den Wald nichtmehr.
    Aber es kann doch auch nicht so schwer sein oder etwa doch?



  • Ganz ehrlich? Klau dir ein Makefile aus einem anderen Projekt und pass es einfach an. Hab ich damals auch so gemacht. 😃

    Aber noch ehrlicher? Benutz eine IDE, dann brauchste keine Makefiles mehr basteln. 😉



  • Problem ist
    1. habe ich auf der Sun leider nur gcc als Compiler und keine Entwicklerumgebung

    2. Ich habe kein vernünftiges Makefile wo ich anpassen kann. Das Makefile welches ich habe ist ewig lang und ich verstehe nur Bahnhof 😢



  • Es gibt aber soviele Linux-/BSD-Projekte die Makefiles dabei haben. Schau einfach mal nach kleinen Projekten auf Sourceforge oder auf Homepages von GPL-Hobbyentwicklern. Solaris ist ja ein Unix? Müsste also so in etwa abschaubar sein.

    Ich hab hier mal eines aus devc++:

    # Project: OpenGL Example
    # Makefile created by Dev-C++ 4.9.9.2
    
    CPP  = g++.exe
    CC   = gcc.exe
    WINDRES = windres.exe
    RES  = OpenGL_private.res
    OBJ  = Main.o $(RES)
    LINKOBJ  = Main.o $(RES)
    LIBS =  -L"C:/Dev-Cpp/lib" -mwindows -lopengl32 -lglu32  
    INCS =  -I"C:/Dev-Cpp/include" 
    CXXINCS =  -I"C:/Dev-Cpp/lib/gcc/mingw32/3.4.2/include"  -I"C:/Dev-Cpp/include/c++/3.4.2/backward"  -I"C:/Dev-Cpp/include/c++/3.4.2/mingw32"  -I"C:/Dev-Cpp/include/c++/3.4.2"  -I"C:/Dev-Cpp/include" 
    BIN  = OpenGL.exe
    CXXFLAGS = $(CXXINCS)  
    CFLAGS = $(INCS)  
    RM = rm -f
    
    .PHONY: all all-before all-after clean clean-custom
    
    all: all-before OpenGL.exe all-after
    
    clean: clean-custom
    	${RM} $(OBJ) $(BIN)
    
    $(BIN): $(OBJ)
    	$(CPP) $(LINKOBJ) -o "OpenGL.exe" $(LIBS)
    
    Main.o: Main.cpp
    	$(CPP) -c Main.cpp -o Main.o $(CXXFLAGS)
    
    OpenGL_private.res: OpenGL_private.rc 
    	$(WINDRES) -i OpenGL_private.rc --input-format=rc -o OpenGL_private.res -O coff
    

    Am Anfang werden die Variablen gesetzt, wie der Compiler heißt usw. Alle libs die gelinkt werder sollen werden unter LIBS aufgeführt.

    Aber wirklich mit make kenne auch ich mich nicht aus.



  • in dem buch is die erstellung von makefiles ganz gut erklärt

    Englisch
    Deutsch



  • 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

    http://bakefile.sourceforge.net/





  • 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


Anmelden zum Antworten