Liebes Forum, ich habe wieder Probleme mit Makefiles. Meine Frage ist, warum die Zeile "g++ -c -o opengl.o opengl.cpp" ausgeführt wird, obwohl diese nirgends enthalten ist? Außerdem wollte ich mit Debugflags bauen, was hier nicht geschieht. Es dreht sich aber wohl nur um die $(TARGET).cpp Datei, die andere Objektdatei wird wie erwartet gebaut. Weiß jemand weshalb make dieses Verhalten an den Tag legt? Gruß
Ich würdejetzt mal vermuten (ohne alles komlett durchexeriert zu haben): $(TARGET): $(OBJECTS) $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) Damit werden zuerst die Objektdateien gebaut und in der zweiten zeile wird der Linker über den Compiler aufgerufen. Compiliert werden die .cpp Dateien zu Objektdateien mittels %.o: %.cpp %.h $(DEPS) $(CC) $(CFLAGS) -c $< $(TARGET) ist ja opengl, also sollten: 1. opengl.cpp zu opengl.o compiliert werden 2. shader.cpp zu shader.o compiliert werden 3. opengl.o und shader.o zu opengl gelinkt werden Jörg
Baudat schrieb: > Meine Frage ist, warum die Zeile "g++ -c -o opengl.o opengl.cpp" > ausgeführt wird, obwohl diese nirgends enthalten ist? > Außerdem wollte ich mit Debugflags bauen, was hier nicht geschieht. Es > dreht sich aber wohl nur um die $(TARGET).cpp Datei, die andere > Objektdatei wird wie erwartet gebaut. Es wird vermutlich eine vordefinierte Regel angewendet. Gibt es denn eine opengl.h? Die ist für deine Regel ja erforderlich. Übrigens: Warum versuchst du, es als C zu linken und dann libstdc++ von Hand hinzuzufügen? Besser wäre, es gleich als C++ zu linken. Dann wird im übrigen auch die libm automatisch mitgelinkt.
Rolf M. schrieb: > Es wird vermutlich eine vordefinierte Regel angewendet. Gibt es denn > eine opengl.h? Die ist für deine Regel ja erforderlich. Tatsächlich sie existiert nicht. Ich dachte make würde das dann einfach hinnehmen, dass diese fehlt. Ich habe dann also %.h entfernt und jetzt klappt es. Da ich alle Headerfiles unter $(DEPS) eingetragen habe, heißt das ja zwangsläufig, dass wenn ein Header bearbeitet wurde das ganze Projekt neu gebaut werden muss. Gibt es eine Möglichkeit das zu verhindern, außer für jede .cpp Datei eine eigene Regel aufzustellen?
Baudat schrieb: > Rolf M. schrieb: >> Es wird vermutlich eine vordefinierte Regel angewendet. Gibt es denn >> eine opengl.h? Die ist für deine Regel ja erforderlich. > > Tatsächlich sie existiert nicht. Ich dachte make würde das dann einfach > hinnehmen, dass diese fehlt. Nein, Abhängigkeiten sind bindend. Wenn davon eine nicht existiert, sucht make nach einer Regel, um sie zu erzeugen oder nach einer, die diese Abhängigkeit nicht hat. Wenn's keine gibt, bricht make mit Fehler "no rule to make target" ab. Wozu sollte man denn auch überhaupt eine Abhängigkeit angeben, wenn make sie dann einfach ignorieren würde? > Da ich alle Headerfiles unter $(DEPS) eingetragen habe, heißt das ja > zwangsläufig, dass wenn ein Header bearbeitet wurde das ganze Projekt > neu gebaut werden muss. Ja. > Gibt es eine Möglichkeit das zu verhindern, außer für jede .cpp Datei > eine eigene Regel aufzustellen? Es gibt die Möglichkeit, diese Regeln durch gcc automatisiert erstellen zu lassen. Der bietet dazu den Kommandozeilenparameter -M und dessen Verwandten. Siehe auch https://gcc.gnu.org/onlinedocs/gcc-9.3.0/gcc/Preprocessor-Options.html#Preprocessor-Options Damit kann man sich ein zusätzliches Makefile erzeugen, das nur alle Header-Abhängigkeiten enthält. Das kann man dann im eigenen Makefile per include einbinden. Die automatische Aktualisierung dieser dependancy-Files kann man dann wiederum per Make-Rule durchführen lassen. Ich hab mal kurz eine Seite dazu ergoogelt, die's soweit ich sehen kann ganz gut erklärt und auch zeigt, wie das Makefile dann aussehen sollte: http://make.mad-scientist.net/papers/advanced-auto-dependency-generation/
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.