Makefile-Problem



  • Ich habe folgendes Makefile:

    prog.exe:     o1.o o2.o o3.o
                   link o1.o ...
    
    o1.o:        funktionen.h  klasse.h
                   compile o1.cpp
    
    o2.o:        funktionen.h  klasse.h
                   compile o2.cpp
    ...
    

    Nun wird klasse.h bereits in funktionen.h inkludiert und ich frage mich, ob es eine Möglichkeit gibt, die es mir erspart, klasse.h bei jedem Objekttarget aufzuführen, und stattdessen funktionen.h zu einem Target zu machen, welches von klasse.h abhängt.
    Versucht habe ich:

    ...
    funktionen.h:     klasse.h
    ...
    

    was jedoch nix bewirkt. Wenn künftig weitere Objektdateien zu solch einem Projekt kommen, bindet man ja im Bedarfsfall funktionen.h bewußt in die cpp-Datei ein, und schafft dementsprechend eine Abhängigkeit im Makefile; die klasse.h - Datei bemerkt man unter Umständen ja gar nicht auf Anhieb.



  • ich bin zwar absoluter makefile-noob, aber kann es sein, dass .h-files in ein Makefile überhaupt nicht rein müssen? die zieht sich doch schon der compiler mit #include-anweisungen rein.
    🙂



  • ich bin zwar absoluter makefile-noob, aber kann es sein, dass .h-files in ein Makefile überhaupt nicht rein müssen? die zieht sich doch schon der compiler mit #include-anweisungen rein.

    Doch, aber die cpp Files müssen auch rein:
    z.B.·

    o1.o: o1.cpp funktionen.h  klasse.h
        compile o1.cpp
    

    Erspaaren kannst du es dir nicht, aber du kannst dir mit dem GCC und einigen anderen Compilern die Abhängigkeiten automatisch erstellen lassen.(mit g++ -MM, wenn du dann noch allgemeine Regeln verwendest, kannst du das ganze mit einem Script automatisieren und musst nur Sonderfälle eintragen
    Ich hab mir z.B. ein (Linux/Bash) Shellscript geschrieben, dass alle Codedateien im src Ordner sucht und mit der Endung .o in einer Liste speichert, sowie alle Bedingungen und den Zielpfad erstellt. Ich muss also nur dieses Script ausführen und neue Codedateien werden automatisch erstellt, bei mir sieht dieses Script z.B. so aus:

    echo "$(g++ -MM $(find ./src -name "*.cpp") | sed 's/.*\.o/obj\/&/')" > Objectfiledependencies
    echo "MAINPROJECTOBJECTFILES = $(echo "$(find ./src -name "*.cpp" | sed 's/.*\///;s/.cpp/.o\\/;s/.*/obj\/&/')" | sed '$s/\\$//')" > Objectfilelist
    

    )



  • OBJ = o1.o o2.o o3.o
    
    %.o: %.cpp funktionen.h klassen.h
            compile $<
    
    prog.exe: $(OBJ)
            link $(OBJ)
    

    Dies sollte so funktionieren.

    %.o: %.cpp
    

    ist eine Regel, wie make Objektdateien erzeugen soll.

    Bsp:

    o1.o soll erzeugt werden. Dafür benötigt der Kompiler:
    o1.cpp funktionen.h und klassen.h
    

    Das $< steht dann für o1.cpp.

    Man gibt zwar die Headerdateien mit an, benötigt aber keine
    Regel der Form:

    funktionen.h: klassen.h
    

    Gruß mcr



  • Danke an Euch alle.

    @fricky:
    Die .h - Dateien müssen drinstehen, damit die Quelldatei (c oder cpp) neu compiliert wird, wenn die .h - Datei sich geändert hat.

    @JustAnotherNoob:
    Die cpp-Dateien müssen nicht rein, weil ich eine Regel definiert habe, so wie MCR es beschrieben hat - ich wollte nur nicht mein ganzes Makefile hier posten, sondern mich auf den relevanten Teil beschränken.
    Ich wußte allerdings nichts von g++ -MM, da muß ich mal sehen, ob das unter MinGW auch geht.

    @MCR:
    In Deiner Lösung werden immer alle obj's erzeugt, auch die, die die beiden .h - Dateien gar nicht benötigen.
    Nicht daß das schlimm wäre, aber genau das wollte ich ja vermeiden, indem ich obj-Targets definiere, die genau 'ihre' .h - Dateien als Bedingung haben ...



  • Belli schrieb:

    @fricky:
    Die .h - Dateien müssen drinstehen, damit die Quelldatei (c oder cpp) neu compiliert wird, wenn die .h - Datei sich geändert hat.

    alles klar, ich wusste, dass ich was übersehen habe. bin halt ein unverbesserlicher IDE-benutzer und die wenigen male, bei denen ich makefiles von hand zurechtgestutzen musste, kann ich an den fingern einer hand abzählen. aber sag mal: es gibt doch generatoren für makefiles, vielleicht eine IDE, die ein make-kompatibles file ausspuckt. warum benutzt du nicht sowas?
    🙂



  • Keine Ahnung ... ich bin kein IDE-Nutzer. Ich editiere mit UltraEdit oder Notepad++ und benutze dann die Kommandozeile für die Projekterstellung.



  • schau dir mal das ultimative Makefile (aus der FAQ) an. Da wird u.a. gezeigt, wie man die Abhängigkeiten sich vom GCC ermitteln lässt und dann in die Makefile einbindet.


Anmelden zum Antworten