Отсутствует разделитель в Makefile? - PullRequest
13 голосов
/ 06 марта 2012

Следующий Makefile не работает, и я не уверен, что происходит.

CC = gcc
CFLAGS = -Wall -g

demo:
    ${CC} ${CFLAGS} demo.c -o demo
lib:
    ${CC} ${CFLAGS} lib.c -o lib
clean:
    rm -f lib demo

Демо имеет основную функцию, а lib имеет набор методов, используемых в демо.

Я добавил флаг -c в lib. Однако когда я запускаю make, я получаю:

Makefile:5: *** missing separator.  Stop.

Ответы [ 6 ]

37 голосов
/ 06 марта 2012

Учитывая ваше обновление с ошибкой, проверьте, что у вас на линии, перед этими ${CC} командами. Для многих make программ требуется символ табуляции real , прежде чем команды и редакторы, помещенные в восемь пробелов (например), будут их разбивать. Это чаще всего причина ошибок «Отсутствует разделитель».

Вы можете увидеть это со следующей расшифровкой. В файле есть четыре пробела перед $(xyzzy):

xyzzy=echo
all:
    $(xyzzy) hello

Итак, когда я это делаю, я получаю ту же ошибку, что и вы:

pax> make
makefile:3: *** missing separator.  Stop.

Но, когда я редактирую его и превращаю эти четыре пробела во вкладку, он отлично работает:

pax> make
echo hello
hello

У вас также есть проблема с тем, как вы пытаетесь объединить исходные файлы.

Без -c флага gcc он попытается создать отдельный исполняемый файл из каждой этих команд, что почти наверняка приведет к ошибкам компоновщика. Вам понадобится что-то вроде (просто):

CC = gcc
CFLAGS = -Wall -g

# Just compile/link all files in one hit.
demo: demo.c lib.c
   ${CC} ${CFLAGS} -o demo demo.c lib.c

clean:
    rm -f demo

или (немного сложнее):

CC = gcc
CFLAGS1 = -Wall -g -c
CFLAGS2 = -g

# Link the two object files together.

demo: demo.o lib.o
   ${CC} ${CFLAGS2} -o demo demo.o lib.o

# Compile each source file to an object.

demo.o: demo.c
   ${CC} ${CFLAGS1} -o demo.o demo.c

lib.o: lib.c
   ${CC} ${CFLAGS1} -o lib.o lib.c

clean:
    rm -f demo

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

5 голосов
/ 06 марта 2012

Вы случайно пропускаете какую-то "вкладку" (\t) до ${CC}?

Часто мой редактор заменяет табуляции пробелами, и я получаю это сообщение.

CC = gcc
CFLAGS = -Wall -g

demo:
[TAB]${CC} ${CFLAGS} demo.c -o demo
lib:
[TAB]${CC} ${CFLAGS} lib.c -o lib
clean:
[TAB]rm -f lib demo
1 голос
/ 11 декабря 2018

Та же ошибка.Когда я здесь использую vi, специальные символы не отображаются.

Причина проста: перед $ {CC} должен быть пробел без пробелов.

1 голос
/ 06 марта 2012

lib необходимо скомпилировать как библиотеку, а не программу.

Попробуйте изменить его на:

main:
    ${CC} ${CFLAGS} main.c lib.o -o main
lib:
    ${CC} ${CFLAGS} lib.c -c -o lib.o
0 голосов
/ 25 апреля 2019

Отступ был моей проблемой.

Моя среда IDE использовала символ табуляции вместо пробелов. Открыл Makefile в vim, сделал :retab переопределение строки с двумя пробелами, и это было решено.

0 голосов
/ 06 марта 2012

Поскольку main зависит от lib:

demo: lib demo.c

и

${CC} ${CFLAGS} lib.c -c -o lib.o
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...