gcc - Makefile: рецепт для цели 'all' не удался после добавления правила зависимости - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть Makefile, который не работает каждый раз, когда я его запускаю.Я изменил Makefile, который компилирует кучу файлов в каталог, который нужно сделать, если его еще нет.all: терпит неудачу, и я, честно говоря, понятия не имею, почему это происходит.

Вот как выглядит мой Makefile:

CC=gcc
SRCDIR=src
INCDIR=include
BINDIR=../bin
CFLAGS = -flags
LIBS = -llibrary1 -llibrary2

all: 
    $(BINDIR) \
    $(BINDIR)/program1 \
    $(BINDIR)/program2 \
    $(BINDIR)/program3

$(BINDIR)/program1: $(SRCDIR)/program1.c | $(BINDIR)
    $(CC) $(CFLAGS) $< -o $@ $(LIBS)

$(BINDIR)/program2: $(SRCDIR)/program2.c | $(BINDIR)
    $(CC) $(CFLAGS) $< -o $@ $(LIBS)

$(BINDIR)/program3: $(SRCDIR)/program3.c | $(BINDIR)
    $(CC) $(CFLAGS) $< -o $@ $(LIBS)

$(BINDIR):
    mkdir -p $@

clean:
    rm -f $(BINDIR)/*

Я знаю, что проблема связана с $(BINDIR), но я не могу понять, что делать.Последний вопрос, который я задал по StackOverflow, дал мне некоторые ресурсы (например, документацию GNU здесь ).Насколько я понимаю, $(BINDIR) должен быть сделан первым, когда я запускаю make, а затем остальные правила должны выполняться без каких-либо проблем.

Вот полученная мной ошибка, которая, как я знаю, означает, что $(BINDIR) не создается до выполнения остальных правил.

user@user-Notebook:~/project/folder$ make
../bin \
    ../bin/program1 \
    ../bin/program2 \
    ../bin/program3
make: ../bin: Command not found
Makefile:16: recipe for target 'all' failed
make: *** [all] Error 127

Чего мне не хватает?

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Как написано в настоящее время, ваше правило «все» не имеет зависимостей и не пустой рецепт.Таким образом, make пытается выполнить ваш список зависимостей как инструкции оболочки.Вот почему вы видите ошибку команды not found, она из оболочки.Удалите символ новой строки после all:, и он должен работать.

0 голосов
/ 21 сентября 2018

Публикация этого ответа как ответа, который не помещался бы в комментарии:

Было бы более разумным, что $ (BINDIR) ( / program ), будет зависимым (и) для цели all , а не команд:

all: $(BINDIR) $(BINDIR)/program1 $(BINDIR)/program2 $(BINDIR)/program3

Проверьте [GNU]: Введение в Makefiles для получения более подробной информации.

Можно сделать еще больше (например, написать шаблонное правило , которое будет обрабатывать всефайлы), чтобы сделать Makefile более компактным.

@ EDIT0 :

За комментарий @ o11cЯ удалил часть ответа, которая была неправильной

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