Forum: PC-Programmierung Makefile mysteriös


von Baudat (Gast)


Angehängte Dateien:

Lesenswert?

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ß

von Joerg W. (joergwolfram)


Lesenswert?

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

von Sebastian (Gast)


Lesenswert?

Zu gnu make gibt es ein ausführliches Handbuch.

von Rolf M. (rmagnus)


Lesenswert?

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.

von Baudat (Gast)


Lesenswert?

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?

von Rolf M. (rmagnus)


Lesenswert?

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/

von Baudat (Gast)


Lesenswert?

Klasse, Dankeschön!

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
Noch kein Account? Hier anmelden.