make: ничего не поделаешь для `всех ' - PullRequest
80 голосов
/ 19 декабря 2011

Я собираюсь, например, через 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'.

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

Ответы [ 7 ]

96 голосов
/ 25 мая 2013

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

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

вместо

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

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

27 голосов
/ 19 декабря 2011

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

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

18 голосов
/ 19 декабря 2011

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

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

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

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

14 голосов
/ 19 декабря 2011

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

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

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

4 голосов
/ 15 января 2012

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

0 голосов
/ 14 июля 2019

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

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

%.o: %.c
    $(CC) $< -o $@

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

foo/apple.o: bar/apple.c $(FOODEPS)
    $(CC) $< -o $@

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...