Подтвердить что ты не робот

Отсутствует разделитель в Makefile?

Следующий файл 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.
4b9b3361

Ответ 1

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

Вы можете видеть это со следующей стенограммой. В файле перед $(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

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

Ответ 2

Вы пропустили какую-либо "вкладку" (\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

Ответ 3

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

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

main:
    ${CC} ${CFLAGS} main.c lib.o -o main
lib:
    ${CC} ${CFLAGS} lib.c -c -o lib.o

Ответ 4

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

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

Ответ 5

Так как main зависит от lib:

demo: lib demo.c

и

${CC} ${CFLAGS} lib.c -c -o lib.o

Ответ 6

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

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