我正在编写一个简单的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
答案 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)