Получение недостающего разделителя при вызове make - PullRequest
0 голосов
/ 24 ноября 2018

Я пишу простой make-файл для компиляции моей программы с исходниками в папке src и заголовками в папке inc, но я получаю сообщение об ошибке

src/test1.c:3: *** missing separator,Stop

Я прочитал несколькопосты здесь об этой ошибке, и все говорят, что это из-за того, что вместо команд перед командами ставятся пробелы вместо символов табуляции. Я на 100% уверен, что использую вкладки , но ошибка остается ... Вот makefile

SOURCE = $(wildcard src/*.c)
OBJECTS = $(SOURCE:.o=.c)
DEBS = $(SOURCE:.d=.c)

-include $(DEBS)

all:$(OBJECTS)
    gcc -o asd.exe $(OBJECTS)

%.o:%.c
    gcc -c $< 

%.d:%.c
    gcc -o $@ -MM $< 

.PHONY:clean

clean:
    rm -f *.c

1 Ответ

0 голосов
/ 24 ноября 2018

TABs против пробелов - это (в данном случае) красная сельдь.В вашем сообщении об ошибке указана проблема:

src/test1.c:3: *** missing separator,Stop.

Хм ... make жалуется на строку 3 файла src/test1.c ... почему парсинг кода C выполняется make!?!?

И вот почему: у вас есть замена в обратном направлении:

OBJECTS = $(SOURCE:.o=.c)
DEBS = $(SOURCE:.d=.c)

Первая строка заменяет все пути xxx.o на xxx.c.Это полная противоположность того, что вы хотите: вы хотите заменить все пути xxx.c на xxx.o.То же самое для файлов .d.

Поскольку подстановок не происходит, неизмененные файлы остаются, поэтому значение переменной DEBS равно src/test1.c и т. Д., Затем вы пытаетесь include, что какmakefile.

Исправьте свои назначения:

OBJECTS = $(SOURCE:.c=.o)
DEBS = $(SOURCE:.c=.d)

Подсказка:

Здесь гораздо эффективнее использовать простое назначение:

SOURCE := $(wildcard src/*.c)
OBJECTS := $(SOURCE:.c=.o)
DEBS := $(SOURCE:.c=.d)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...