Wird dieses Verhalten erwartet?

344
bool3max

Meine Ordnerstruktur sieht folgendermaßen aus:

. ├── app.c ├── inc │   ├── butil.h │   └── libs │   ├── flagutil.h │   ├── libflagutil.c │   └── libflagutil.o └── Makefile 

Mein Makefilesieht so aus:

CC = gcc WARN = -Wall -Wconversion -Wextra -Wno-unused-variable -Wno-unused-parameter DEBUG = -ggdb -O0  app: ./app.c ./inc/libs/flagutil.h ./inc/butil.h ./inc/libs/libflagutil.o $(CC) $(WARN) app.c ./inc/libs/libflagutil.o -o ./app  libflagutil.o: ./inc/libs/libflagutil.c ./inc/libs/flagutil.h  $(CC) $(WARN) ./inc/libs/libflagutil.c -c -o ./inc/libs/libflagutil.o  app-debug: ./app.c ./inc/libs/flagutil.h ./inc/butil.h ./inc/libs/libflagutil.o $(CC) $(WARN) $(DEBUG) app.c ./inc/libs/libflagutil.o -o ./app 

Ich bin etwas verwirrt über sein Verhalten. Nehmen wir an, ich mache eine kritische Änderung in der ./inc/libs/flagutil.hDatei. Beides appund libflagutil.oabhängig davon.

Dann renne ich einfach make. Da die Hauptregel appdavon abhängt ./inc/libs/flagutil.hund geändert wurde, wird die Zeile unterhalb der Regel ausgeführt.

ABER, libflagutil.odie von der app(Hauptregel) abhängig ist ./inc/libs/flagutil.h, hängt auch von ab, und ihre Änderung könnte einen kritischen Effekt auf libflagutil.odie Abhängigkeit von haben app.

Beim einfachen makeAusführen wurde die libflagutil.oRegel jedoch nicht ausgeführt. Dies bedeutet, dass libflagutil.cdie Neukompilierung nicht ausgeführt wurde und die appausführbare Datei mit der alten Version von verknüpft wurde libflagutil.o.

Dies könnte natürlich behoben werden, indem make libflagutil.onach einer Änderung explizit ausgeführt /inc/libs/flagutil.hwird und erst dann die Hauptregel ausgeführt wird. Aber ist dies nicht der Sinn make, um Ärger wie diese zu vermeiden?

Fehlt mir etwas oder wird dieses Verhalten erwartet?

0
Was passiert, wenn Sie den vollständigen Pfad zu "libflagutil.o" im Ziel der zweiten Regel verwenden? choroba vor 5 Jahren 2
@choroba Das hat es geschafft. Vielen Dank. bool3max vor 5 Jahren 0
Ich kann nicht in Ihrem `Makefile`-Abschnitt` all` sehen, wo alle Abhängigkeiten beschrieben wurden Alex vor 5 Jahren 0

1 Antwort auf die Frage

2
choroba

Sie müssen die vollständigen Pfade zu den Dateien in Regelzielen angeben. Andernfalls werden sie im aktuellen Verzeichnis gespeichert.

In Ihrem Fall verwenden Sie

./inc/libs/libflagutil.o: ./inc/libs/libflagutil.c ./inc/libs/flagutil.h 

in der zweiten Regel.