Я просматриваю, например, 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'.
Пожалуйста, помогите мне разобраться, как скомпилировать эту программу.
hello
актуальность. Изменитеclean
на,rm -f *.o hello
прежде чем он сделает что-нибудь неожиданное, затем запуститеmake clean all
и посмотрите, работает ли это..phony: all clean
, посколькуall
иclean
не являются именами файлов.Ответы:
Иногда ошибка «Нечего делать для всех» может быть вызвана пробелами перед командой в правиле makefile вместо табуляции. Пожалуйста, убедитесь, что вы используете табуляцию вместо пробелов внутри ваших правил.
вместо того
См. Описание синтаксиса правила в руководстве GNU make: https://www.gnu.org/software/make/manual/make.html#Rule-Syntax
источник
all : src/server/mod_wsgi.la
, на которое я перешелall : </t> src/server/mod_wsgi.la
. Теперь я получаю сообщение об ошибке:make: execvp: src/server/mod_wsgi.la: Permission denied Makefile:29: recipe for target 'all' failed make: *** [all] Error 127
послеsudo make
. Любая помощь?Удалите
hello
файл из папки и попробуйте еще раз.all
Цели зависит отhello
цели.hello
Цель сначала пытается найти соответствующий файл в файловой системе. Если он его найдет и все зависимые файлы обновлены - делать нечего.источник
Когда вы просто отдаете команду make, она создает первое правило в вашем make-файле, то есть «все». Вы указали, что «все» зависит от «hello», которое зависит от main.o, factorial.o и hello.o. Итак, make пытается увидеть, есть ли эти файлы.
Если они присутствуют, make проверяет, изменились ли их зависимости, например, main.o имеет зависимость main.c. Если они изменились, make перестраивает их, иначе правило пропускается. Точно так же он рекурсивно создает файлы, которые были изменены, и, наконец, запускает самую верхнюю команду, «all» в вашем случае, чтобы дать вам исполняемый файл, «hello» в вашем случае.
Если их нет, make вслепую строит все по правилу.
Переходя к вашей проблеме, это не ошибка, но make говорит, что все зависимости в вашем make-файле обновлены и не нужно ничего делать!
источник
Make ведет себя правильно.
hello
уже существует и не старше.c
файлов, поэтому больше нечего делать. Существует четыре сценария, в которых программе make потребуется (пере) собрать:.c
файлов, он будет новееhello
, а затем его придется перестраивать при запуске make.hello
, то его явно придется восстанавливать-B
опции.make -B all
make clean all
удалитhello
и потребует перестройки. (Предлагаю вам посмотреть комментарий @Mat оrm -f *.o hello
источник
Я думаю, вы пропустили вкладку в 9-й строке. Строка после all: hello должна быть пустой вкладкой. Убедитесь, что у вас есть пустая вкладка в 9-й строке. Это даст интерпретатору понять, что вы хотите использовать рецепт по умолчанию для make-файла.
источник
Это не ошибка; команда make в unix работает на основе меток времени. То есть, допустим, если вы внесли определенные изменения
factorial.cpp
и скомпилировали с помощью,make
то make показывает информацию о том, чтоcc -o factorial.cpp
выполняется только команда. В следующий раз, если вы выполните ту же команду, то естьmake
без внесения каких-либо изменений в какой-либо файл с.cpp
расширением, компилятор сообщит, что выходной файл обновлен. Компилятор предоставляет эту информацию, пока мы не внесем в какие-либо определенные измененияfile.cpp
.Преимущество этого метода
makefile
заключается в том, что он сокращает время перекомпиляции за счет компиляции только измененных.o
файлов и прямого использования файлов object ( ) немодифицированных файлов.источник
Я пришел к этой специфической, трудно поддающейся отладке ошибке другим путем. Моя проблема заключалась в том, что я использовал шаблонное правило на этапе сборки, когда цель и зависимость находились в разных каталогах. Что-то вроде этого:
У меня было настроено несколько зависимостей таким образом, и я пытался использовать один рецепт шаблона для всех. Ясно, что единственная замена "%" здесь не сработает. Я установил четкие правила для каждой зависимости и снова оказался среди щенков и единорогов!
Надеюсь, это кому-то поможет!
источник