Отсутствует разделитель в 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

С main зависит от lib:

demo: lib demo.c

и

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