Моя структура папок выглядит так:
.
├── app.c
├── inc
│ ├── butil.h
│ └── libs
│ ├── flagutil.h
│ ├── libflagutil.c
│ └── libflagutil.o
└── Makefile
Мой Makefile выглядит так:
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
Я немного озадачен его поведением. Допустим, я внес критическое изменение в файл ./inc/libs/flagutil.h . И app и libflagutil.o зависят от этого.
Затем я просто запускаю make . Поскольку app основного правила зависит от ./inc/libs/flagutil.h , и оно было изменено, выполняется строка под правилом.
НО, libflagutil.o , который зависит от app (основное правило), также зависит от ./inc/libs/flagutil.h , и его изменение может оказать критическое влияние на libflagutil.o , который, опять же, зависит от app
Однако простое выполнение make не выполняло правило libflagutil.o , что означает, что libflagutil.c не был перекомпилирован, а исполняемый файл app связан со старой версией libflagutil.o .
Это, конечно , может быть исправлено путем явного запуска make libflagutil.o после внесения изменений в /inc/libs/flagutil.h и только затем запустить основное правило, но не вся суть make , чтобы избежать неприятностей , таких как это один?
Я что-то упустил или такое поведение ожидается?
