Ожидается ли такое поведение?

290
bool3max

Моя структура папок выглядит так:

. ├── 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избегать неприятностей, подобных этому?

Я что-то упустил или такое поведение ожидается?

0
Что произойдет, если вы используете полный путь к `libflagutil.o` в качестве цели второго правила? choroba 6 лет назад 2
@choroba Это сделал это. Благодарю. bool3max 6 лет назад 0
Я не вижу в вашем `Makefile` разделе` all`, где описаны все зависимости Alex 6 лет назад 0

1 ответ на вопрос

2
choroba

Вам необходимо указать полные пути к файлам в целевых объектах правил, иначе make считает, что они находятся в текущем каталоге.

В вашем случае используйте

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

во втором правиле.

Похожие вопросы