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