Ответ 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
Проблема с первым решением заключается в том, что он без необходимости компилирует обе программы, даже если только один устарел. Второе решение немного более разумно.