调用make时缺少分隔符

时间:2018-11-24 14:47:16

标签: c makefile

我正在编写一个简单的makefile来编译程序,其中的源文件位于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 :(得分:3)

TAB与空格之间的关系(在这种情况下)是红色鲱鱼。您的错误消息显示了问题:

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

嗯... make正在抱怨文件src/test1.c的第3行...为什么make解析您的C代码!?!?

这是为什么:您的替补位置向后:

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)