Make: ничего не сделать для `all '

Я просматриваю, например, pgm, чтобы создать файл make.

http://mrbook.org/tutorials/make/

Моя папка eg_make_creation содержит следующие файлы,

desktop:~/eg_make_creation$ ls
factorial.c  functions.h  hello  hello.c  main.c  Makefile

Makefile

# I am a comment, and I want to say that the variable CC will be
# the compiler to use.
CC=gcc
# Hwy!, I am comment no.2. I want to say that CFLAGS will be the
#options I'll pass to the compiler
CFLAGS=-c -Wall

all:hello

hello:main.o factorial.o hello.o
  $(CC) main.o factorial.o hello.o -o hello

main.o:main.c
  $(CC) $(CFLAGS) main.c

factorial.o:factorial.c
  $(CC) $(CFLAGS) factorial.c

hello.o:hello.c
  $(CC) $(CFLAGS) hello.c

clean:
  rm -rf *o hello

Ошибка:

desktop:~/eg_make_creation$ make all
make: Nothing to be done for `all'.

Пожалуйста, помогите мне понять, как скомпилировать эту программу.

Ответ 1

Иногда ошибка "Ничего не делать для всех" может быть вызвана пробелами перед командой в правиле makefile вместо tab. Пожалуйста, убедитесь, что вы используете вкладки вместо пробелов внутри ваших правил.

all:
<\t>$(CC) $(CFLAGS) ...

вместо

all:
    $(CC) $(CFLAGS) ...

Пожалуйста, обратитесь к руководству по GNU make для описания синтаксиса правила: https://www.gnu.org/software/make/manual/make.html#Rule-Syntax

Ответ 2

Удалите файл hello из папки и повторите попытку.

Цель all зависит от цели hello. Цель hello сначала пытается найти соответствующий файл в файловой системе. Если он находит это и обновляется с зависимыми файлами - делать нечего.

Ответ 3

Когда вы просто даете make, он делает первое правило в вашем make файле, т.е. "все" . Вы указали, что "все" зависит от "привет", которое зависит от main.o, factorial.o и hello.o. Итак, "make" пытается увидеть, присутствуют ли эти файлы.

Если они присутствуют, "make" видит, зависят ли их зависимости, например. main.o имеет зависимость main.c, изменились. Если они изменились, перестройте их, иначе пропустите правило. Точно так же он рекурсивно идет о создании файлов, которые были изменены и, наконец, запускает самую большую команду, "все" в вашем случае, чтобы предоставить вам исполняемый файл "привет" в вашем случае.

Если они отсутствуют, вслепую строит все под правилом.

Приходя к вашей проблеме, это не ошибка, но "make" говорит, что каждая зависимость в вашем make файле обновлена, и ничего не нужно делать!

Ответ 4

Make ведет себя корректно. hello уже существует и не старше файлов .c, и поэтому больше не нужно выполнять работу. Существует четыре сценария, в которых make необходимо будет (re) построить:

  • Если вы измените один из ваших файлов .c, то он будет новее, чем hello, а затем он будет восстановлен при запуске make.
  • Если вы удалите hello, то, очевидно, придется перестроить его
  • Вы можете заставить make перестроить все с помощью опции -B. make -B all
  • make clean all удалит hello и потребует перестройки. (Я предлагаю вам посмотреть комментарий @Mat о rm -f *.o hello

Ответ 5

Это не ошибка, когда команда make в unix работает на основе временных меток, т.е. позволяет сказать, вы внесли определенные изменения в factorial.cpp и скомпилируете с помощью make..then make shows информация о том, что выполняется только команда ** cc -o factorial.cpp **. В противном случае, если вы выполните ту же команду, что и без внесения каких-либо изменений в любой файл с расширением .cpp то компилятор говорит, что выходной файл обновлен... компилятор дает эту информацию пока мы не внесем определенные изменения в файл file.cpp.                            Преимущество файла make заключается в том, что он сокращает время перекомпиляции, компилируя только файлы, которые были изменены, и напрямую используя файлы (.o) немодифицированных файлов......

Ответ 6

Я думаю, что вы пропустили вкладку в 9-й строке. Строка после всех: привет должна быть пустой вкладкой. Убедитесь, что у вас есть пустая вкладка в 9-й строке. Это даст интерпретатору понять, что вы хотите использовать рецепт по умолчанию для make файла.

Ответ 7

Я пришел к этой своеобразной, трудно отлаживаемой ошибке по другому маршруту. Моя проблема закончилась тем, что я использовал шаблонное правило на этапе сборки, когда цель и зависимость были расположены в разных каталогах. Что-то вроде этого:

foo/apple.o: bar/apple.c $(FOODEPS)

%.o: %.c
    $(CC) $< -o [email protected]

У меня было несколько зависимостей, настроенных таким образом, и я пытался использовать один шаблонный рецепт для них всех. Понятно, что единственная замена "%" здесь не сработает. Я установил четкие правила для каждой зависимости и снова оказался среди щенков и единорогов!

foo/apple.o: bar/apple.c $(FOODEPS)
    $(CC) $< -o [email protected]

Надеюсь, это поможет кому-то!