Отсутствует разделитель в 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
Demo имеет основную функцию, а lib имеет набор методов, используемых в demo.
я добавил флаг-c в lib. Однако, когда я запускаю make, я получаю:
Makefile:5: *** missing separator. Stop.
4 ответов
учитывая ваше обновление с ошибкой, проверьте, что у вас на линии до тех ${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
проблема с первым решением заключается в том, что он излишне компилирует обе программы, даже если только одна устарела. Второе решение более разумно.
вы пропустите некоторые "tab" (\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
lib
должен быть скомпилирован как библиотека, а не программа.
попробуйте изменить его на:
main:
${CC} ${CFLAGS} main.c lib.o -o main
lib:
${CC} ${CFLAGS} lib.c -c -o lib.o