makefile wird nicht neu ausgeführt



  • Hallo,

    Ich habe folgendes Makefile

    main: main.cpp utils.cpp utils.h
    	echo "test"
    	g++ -std=c++20 utils.cpp main.cpp -o main
    

    aber obwohl die dateien alle neu gespeichert wurden und ich

    make
    

    ausführe, kommt nur "make: `main' is up to date.". Weiß jemand warum? Danke!


  • Mod

    Das sollte nicht so sein, schaut alles perfekt aus. Wir können wohl auch ausschließen, dass das ein interner Fehler von make ist, bei der Grundfunktion eines Werkzeugs, das bald seinen 50. Geburtstag feiert.

    Theorien:

    • Du hast irgendwelche ganz komische Einstellungen an deinem Dateisystem, wie dass es keine Zeitstempel aktualisiert. Wenn du denkst, dass du irgendein ungewöhnliches System haben könntest, prüf das mal.
    • Du tust nicht, was du denkst, was du tust. Vielleicht sind die Dateien, die du änderst, gar nicht die Dateien die Make sieht. Weil du irgendwie in einem anderen Verzeichnis bist oder so.
    • Du verschweigst uns etwas wichtiges. Vielleicht ist dies ein vereinfachtes Beispiel zu deinem eigentlichen Problem, bei dem du ein wichtiges Details weggelassen hast. Bitte stell sicher, dass das was du uns hier zeigst, wirklich 1:1 das ist, was bei dir läuft, und dass es auch überhaupt das Problem zeigt.
    (base) seppj@cpp {<src/make}> ls -l
    total 8.0K
    -rw-r--r-- 1 seppj users 14 Oct  2 12:01 main.cpp
    -rw-r--r-- 1 seppj users 78 Oct  2 12:01 Makefile
    -rw-r--r-- 1 seppj users  0 Oct  2 12:01 utils.cpp
    -rw-r--r-- 1 seppj users  0 Oct  2 12:01 utils.h
    (base) seppj@cpp {<src/make}> cat Makefile
    main: main.cpp utils.cpp utils.h
            echo "test"
            g++ utils.cpp main.cpp -o main
    (base) seppj@cpp {<src/make}> make
    echo "test"
    test
    g++ utils.cpp main.cpp -o main
    (base) seppj@cpp {<src/make}> make
    make: 'main' is up to date.
    (base) seppj@cpp {<src/make}> touch main.cpp
    (base) seppj@cpp {<src/make}> make
    echo "test"
    test
    g++ utils.cpp main.cpp -o main
    

    Wie man sieht, es funktioniert bei mir wie es sollte. So etwas solltest du auch einmal vorführen für deinen Fehlerfall. Unverfälscht! (Anonymisierung ist natürlich okay.)



  • danke für deine ausführliche antwort. Ich habe jetzt noch weitere dateien hinzugefügt und nun klappt es komischerweise. Das ist das neue Makefile

    main: main.cpp utils.cpp utils.h test_utils.cpp test_utils.h
    	g++ -std=c++20 utils.cpp main.cpp test_utils.cpp -o main
    

    ich speichere die dateien nach wie vor neu über visual studio code.
    Ich hoffe einfach es bleibt jetzt dabei.



  • Vermutlich hat vscode beim speichern die .cpp dateien im dateisystem nicht verändert, weil es keine Änderungen gab.
    Oder du hast nur Änderungen in den header files gemacht.
    In diesem Falle ist es auch klar wieso das nicht funktioniert. Weil das make file nur die *.cpp prüft ob sie modifiziert sind und sonst nichts.
    Das Makefile interessiert sich nicht für den Inhalt!

    Deswegen ist es wichtig wenn man beim stellen der Frage genau beschreibt was man getan hat


  • Mod

    @firefly sagte in makefile wird nicht neu ausgeführt:

    Oder du hast nur Änderungen in den header files gemacht.
    In diesem Falle ist es auch klar wieso das nicht funktioniert. Weil das make file nur die *.cpp prüft ob sie modifiziert sind und sonst nichts.

    Da steht aber utils.h als Abhängigkeit, das muss funktionieren. Makefiles verstehen nix von der Semantik von Dateiendungen (okay, eigentlich doch, weil es sehr viele vorgefertigte Makros für alle möglichen Spezialzwecke gibt, aber formell verstehen sie nix), die gucken nur, ob in der gegebenen Liste sich etwas geändert hat.


Anmelden zum Antworten