C Makefile缺少分隔符,但具有硬制表符

C Makefile缺少分隔符,但具有硬制表符,c,makefile,C,Makefile,我有3个文件,我想为它们制作一个makefile 这些文件是: polyHeader.c(这是包含所有函数定义的文件) polyHeader.h(这是包含所有函数声明/原型的头文件) polyTest.c(这是包含主函数的文件) 我创建了以下生成文件: 注意:我不确定我是否也应该处理makefile中的头文件(polyHeader.h),或者这是否需要编译(即链接器是否会找到它并链接到它-我已经使用#include“polyHeader.h”将它包含在其他两个文件中) 无论如何,当我为上面显

我有3个文件,我想为它们制作一个makefile

这些文件是:

  • polyHeader.c
    (这是包含所有函数定义的文件)

  • polyHeader.h
    (这是包含所有函数声明/原型的头文件)

  • polyTest.c
    (这是包含主函数的文件)

我创建了以下生成文件:

注意:我不确定我是否也应该处理makefile中的头文件(polyHeader.h),或者这是否需要编译(即链接器是否会找到它并链接到它-我已经使用
#include“polyHeader.h”
将它包含在其他两个文件中)

无论如何,当我为上面显示的makefile运行make命令时,我得到以下错误:

Makefile:2: *** missing seperator. Stop.
有人能告诉我怎么解决这个问题吗

polyTest: polyTest.c polyHeader.o
该行表示polyTest依赖于polyTest.c和PolyHeader.o。 但是在这一行中,我看不到依赖性

gcc -Wall -o polyTest polyTest.c

这个gcc行应该以一个制表符而不是空格开头。

这个makefile似乎缺少某些元素 建议阅读 有关简单makefile内容的详细信息

我建议这样写:

// indicate certain targets will never be created
.PHONY: all clean

// get list of source files (wildcard would be an even better method)
SRCS = polyHeader.c polyTest.c

// convert list of source files to list of obj files
OBJS = $(SRCS:.c=.o)

CC=gcc
CFLAGS= -Wall -c -I.
DEPS = polyHeader.h

// first/default target when not listed on command
all: poly ${OBJS}

// link objects to make 'poly' executable
poly: ${OBJS}
    $(CC) $(LFLAGS) -o poly $(OBJS)  

// compile each source file into a object file
%.o: %.c $(DEPS)
    $(CC) $(CFLAGS) -o $@ $< 

// target for removing debris from current directory
clean: 
    rm -f *.o
    rm -f poly
//表示永远不会创建某些目标
.骗子:都是干净的
//获取源文件列表(通配符是更好的方法)
SRCS=polyHeader.c polyTest.c
//将源文件列表转换为obj文件列表
OBJS=$(SRCS:.c=.o)
CC=gcc
CFLAGS=-Wall-c-I。
DEPS=polyHeader.h
//命令中未列出的第一个/默认目标
全部:poly${OBJS}
//链接对象以使“多边形”可执行
多边形:${OBJS}
$(CC)$(LFLAGS)-o多边形$(OBJS)
//将每个源文件编译成一个目标文件
%.o:%.c$(DEPS)
$(CC)$(CFLAGS)-o$@$<
//用于从当前目录中删除碎片的目标
清洁:
rm-f*.o
rm-f poly

在makefile正常工作后,编译将出现问题;您需要在创建
polyTest
的命令行中包含
polyHeader.o
。不过,这与您当前的问题无关。@user4225083在不影响问题答案的情况下,增加可读性是好的。例如,制表符/空格是makefiles的常见问题。如果第一行后面没有空行,那么问题是(99%可能)第2行(
gcc
行)开头没有制表符,尽管问题标题中有相反的声明。显示
od-cmakefile
或某些等效十六进制转储的输出。我不得不猜测,它在开始时是空白的,而不是标签,即使在创建文件时键入了标签。(在
vim
中的
:set et
选项将制表符扩展到空格中,除非您非常小心和/或
vim
知道
makefile
s。)@user4225083制表符应显示为
\t
。我告诉过您这个问题(未定义的引用)在我的第一个评论中,将
-c
放在
CFLAGS
变量中而不是放在配方中是不寻常的,而且
LDFLAGS
LFLAGS
更为传统,如果LDFLAGS(或LFLAGS)在目标文件之前,则需要在目标文件之后加上LDLIBS或类似的值。否则,链接器会扫描库,然后扫描对象文件,而这通常不起作用。另外,
all
目标通常不应将
${OBJS}
列为依赖项-它依赖于
poly
poly
明确依赖于
${OBJS}
。重新定义
CC=gcc
是毫无意义的,因为它已经包含了正确的值,而
CFLAGS
混合了编译器标志和预处理器标志,它们应该在
cppfagas
变量中
rm-f
应替换为
$(rm)
,而不定义它。
// indicate certain targets will never be created
.PHONY: all clean

// get list of source files (wildcard would be an even better method)
SRCS = polyHeader.c polyTest.c

// convert list of source files to list of obj files
OBJS = $(SRCS:.c=.o)

CC=gcc
CFLAGS= -Wall -c -I.
DEPS = polyHeader.h

// first/default target when not listed on command
all: poly ${OBJS}

// link objects to make 'poly' executable
poly: ${OBJS}
    $(CC) $(LFLAGS) -o poly $(OBJS)  

// compile each source file into a object file
%.o: %.c $(DEPS)
    $(CC) $(CFLAGS) -o $@ $< 

// target for removing debris from current directory
clean: 
    rm -f *.o
    rm -f poly