последняя цель makefile не выполняется

#makefile

#makefile

Вопрос:

 word.o: word.c word.h
        gcc -c word.c
line.h: word.h
        touch line.h
 

Выше приведено содержимое makefile. когда я выполняю make.
Я вижу, что файл word.o создан. Но файл line.h не выполняется.
В чем может быть причина этого? Насколько я знаю, make не
выполните те цели, которые не имеют никаких зависимостей.
Но здесь список зависимостей не пуст, тем не менее, он не был выполнен

Ответ №1:

Конечно, make создает цели, которые не имеют зависимостей. Если у цели нет зависимостей, то она считается устаревшей, если она не существует.

Проблема в том, что make не создает каждую отдельную цель в файле makefile: это было бы плохо, потому что многие люди включают clean цели, test цели и другие цели, которые они хотят запускать только иногда и не каждый раз.

Вы можете прочитать введение в руководстве GNU make, в частности в этом разделе, чтобы понять, что происходит.

Комментарии:

1. The other rules are processed because their targets appear as prerequisites of the goal — Эта строка, вероятно, объясняет это. Итак, я понимаю, что существуют определенные цели, которые являются целями , и по умолчанию первая цель является единственной, которая установлена в качестве цели, и никакой другой (пропуская те, которые начинаются с a .)

2. Важная информация — это самое первое предложение: по умолчанию make начинается с первой цели . В вашем makefile первой целью является word.o , так что цель (и ее предварительные условия) — это все, что создано по умолчанию.

3. Если line.h не «собран», то это означает, что он новее, чем word.h файл, поэтому make не нужно ничего делать, чтобы обновить его.

4. Я действительно не понимаю, почему вы хотите коснуться line.h , если он старше word.h ; это кажется очень странной ситуацией. Но, возможно, у вас есть странное требование 🙂

5. Я взял этот пример откуда-то, просто чтобы понять, как работает makefile. строка. h не только там. Он будет создан, когда после touch line.h этого ничего не произойдет. Я думаю, что вопрос о построении и времени появится в строке when. h был существующим файлом. Итак, я понимаю, что концепция цели входит в картину