Mehrere .o in einer Makefile erzeugen



  • Hallo COmmunity,

    ich wollte mal fragen ob es irgendwie möglich ist mehrere .o files zu erstellen innerhalb einer makefile?( brauche die für eine lib file unter linux)
    Mein Code sieht atm so aus :

    Object3d.o: Object3d.cpp ShaderManager.h math3d.h
            gcc -c Object3d.cpp
    ShaderManager.o: ShaderManager.cpp ShaderManager.h Utility.h
            gcc -c ShaderManager.cpp
    math3d.o: math3d.cpp math3d.h
            gcc -c math3d.cpp
    

    Wie bringe ich Make nun dazu mir jedes .o zu generieren?
    Wenn ich make ausführe, macht er den Obersten Eintrag in diesem Fall Object3d.o und bricht ab.

    Hoffe jemand kann helfen 🙂



  • all: Object3d ShaderManager.o math3d.o
        # Dein code zum erstellen der Lib
    Object3d.o: Object3d.cpp ShaderManager.h math3d.h
            gcc -c Object3d.cpp
    ShaderManager.o: ShaderManager.cpp ShaderManager.h Utility.h
            gcc -c ShaderManager.cpp
    math3d.o: math3d.cpp math3d.h
            gcc -c math3d.cpp
    


  • Makefile - diedas ultimative Makefile für jedes Projekt: http://www.c-plusplus.net/forum/88418



  • thx pyhax klappt 🙂

    @ultimater: auch thx 😉 aber will es selber lernen und üben. Macht ja auch fun sowas


  • Mod

    Ungestestet kann das ungefähr so aussehen:

    # Regel für all: Erstelle das Programm
    all: program
    
    # Liste der Quelltextdateien
    SOURCES = a.c b.c c.c d.c
    
    # Generiere daraus eine Liste der Objektdateien. Schneide dazu das .c ab und pappe .o dran:
    OBJECTS = $(addsuffix .o, $(basename $(SOURCES)))
    
    # Das Programm wird aus den Objektdateien zusammengelinkt. CC und LDFLAGS müssen gegebenenfalls vorher gesetzt werden.
    # Achtung: Ich kann im Forum kein Tab-Zeichen machen, nicht per Copy&Paste übernehmen
    program: $(OBJECTS)
            $(CC) -o $@ $^ $(LDFLAGS)
    # Zur Erinnerung: $@ ist der Name des Rezepts selbst (also hier program) und $^ die Abhängigkeiten
    
    # Für die Objektdateien selbst könnte man auch ein Rezept erstellen, indem man
    # eine Regel für alle .o Dateien einführt. Aber Make hat dafür bereits ein automatisches Rezept.
    # Siehe auch: http://www.gnu.org/software/make/manual/make.html#make-Deduces
    # und: http://www.gnu.org/software/make/manual/make.html#Catalogue-of-Rules
    
    # Wir wollen sicherlich auch Aufräumen, das kann dann z.B. so aussehen:
    clean:
            -$(RM) $(OBJECTS) program
    # Immer schön Gebrauch machen von den automatischen Variablen, wie hier $(RM) statt direkt rm zu schreiben
    # Siehe: http://www.gnu.org/software/make/manual/make.html#Implicit-Variables
    
    # Die Abhängigkeit von .h-Dateien ist während des Entwickelns noch wichtig.
    # Falls es installiert ist, kann sich makedepend automatisch da drum kümmern.
    # Man muss dann "make depend" machen, wenn sich die Abhängigkeiten
    # von den .h-Dateien geändert haben. Bei Änderung der .h-Dateien wird dann auch
    # gegebenenfalls eine abhängige .c-Datei neu übersetzt.
    depend:
            makedepend $(CFLAGS) -Y $(SOURCES)
    


  • @SeppJ
    .PHONY für clean und all (und depend?) vergessen.

    @demonking
    Dann schau dir aber lieber die ultimative Makfile oder SeppJs Beispiel an. Dein Beispiel funktioniert zwar, ist aber nicht sehr elegant (nutzt keine impliziten Regeln. Hält sich nicht an die CC/CFLAGS Konvention. Hand geschriebene Abhängigkeiten. Kein clean. etc.)

    Allgemein würde ich auch keine Makefiles selbst schreiben. Sobald du irgend welche Bibliotheken etc. benötigst, brauchst du einfach einen configure-Part. Daher würde ich eher autotools, CMake, waf, etc. verwenden.


  • Mod

    rüdiger schrieb:

    @SeppJ
    .PHONY für clean und all (und depend?) vergessen.

    Ups. Danke fur den Hinweis.

    Allgemein würde ich auch keine Makefiles selbst schreiben. Sobald du irgend welche Bibliotheken etc. benötigst, brauchst du einfach einen configure-Part. Daher würde ich eher autotools, CMake, waf, etc. verwenden.

    Ich habe eigentlich die Erfahrung gemacht, dass man ziemlich lange mit Handgeschriebenem auskommt. Dank der vielen, vielen, automatischen Regeln ist meistens gar nicht so viel zu tun und das Endresultat ist trotzdem höchst abstrakt und somit portabel. Man muss die Regeln und impliziten Variablen bloß kennen. Ich finde die Lernkurve für Makefiles ist jedenfalls sehr viel flacher als die der automatischen Buildsysteme. Diese ist sogar besonders steil, wenn man selber wenig Ahnung von Makefiles hat und gar nicht richtig kapiert, was diese Werkzeuge überhaupt tun.

    Zumindest für den Anfang würde ich daher auf jeden Fall selber die Makefiles schreiben, bis man ungefähr so weit ist, dass man das hier verlinkte ultimative Makefile einigermaßen gut verstehen kann. Und dann zwingt man sich, ein Buildsystem zu benutzen, selbst wenn es nur für ein "Hello World"-Programm ist. Vielleicht sogar gerade für etwas einfaches. Dann lernt man auch damit umzugehen. Die ultimative Frage ist natürlich autotools oder cmake? 😃


Anmelden zum Antworten