以下Makefile不起作用,我不确定发生了什么。
CC = gcc
CFLAGS = -Wall -g
demo:
${CC} ${CFLAGS} demo.c -o demo
lib:
${CC} ${CFLAGS} lib.c -o lib
clean:
rm -f lib demo
Demo具有main函数,lib具有一组演示中使用的方法。
我在-cg中添加了-c标志。但是,当我运行make时,我得到:
Makefile:5: *** missing separator. Stop.
鉴于您对错误的更新,请在${CC}
命令之前检查您在线上的内容。许多make
程序在命令和编辑器之前需要一个真正的制表符,这些命令和编辑器放入八个空格(例如)会破坏它们。这通常是“缺失分隔符”错误的原因。
你可以看到以下成绩单。在文件中,$(xyzzy)
之前有四个空格:
xyzzy=echo
all:
$(xyzzy) hello
所以,当我做到这一点时,我会得到与你相同的错误:
pax> make
makefile:3: *** missing separator. Stop.
但是,当我编辑它并将这四个空格转换为选项卡时,它可以正常工作:
pax> make
echo hello
hello
您还尝试将源文件组合在一起时遇到问题。
如果-c
没有gcc
标志,它将尝试从每个命令创建单独的可执行文件,几乎肯定会导致链接器错误。你需要像(简单)这样的东西:
CC = gcc
CFLAGS = -Wall -g
# Just compile/link all files in one hit.
demo: demo.c lib.c
${CC} ${CFLAGS} -o demo demo.c lib.c
clean:
rm -f demo
或(稍微复杂一点):
CC = gcc
CFLAGS1 = -Wall -g -c
CFLAGS2 = -g
# Link the two object files together.
demo: demo.o lib.o
${CC} ${CFLAGS2} -o demo demo.o lib.o
# Compile each source file to an object.
demo.o: demo.c
${CC} ${CFLAGS1} -o demo.o demo.c
lib.o: lib.c
${CC} ${CFLAGS1} -o lib.o lib.c
clean:
rm -f demo
第一种解决方案的问题是,即使只有一个程序已经过时,它也会不必要地编译这两个程序。第二种解决方案更加智能化。
你有没有机会在\t
之前错过一些“tab”(${CC}
)?
通常我的编辑器将用空格替换制表符,我会收到此消息。
CC = gcc
CFLAGS = -Wall -g
demo:
[TAB]${CC} ${CFLAGS} demo.c -o demo
lib:
[TAB]${CC} ${CFLAGS} lib.c -o lib
clean:
[TAB]rm -f lib demo
lib
需要编译为库,而不是程序。
尝试将其更改为:
main:
${CC} ${CFLAGS} main.c lib.o -o main
lib:
${CC} ${CFLAGS} lib.c -c -o lib.o
同样的错误。当我在这里使用vi时,不会显示特殊字符。
原因很简单:$ {CC}前面应该有一个TAB空格。
由于main
依赖于lib
:
demo: lib demo.c
和
${CC} ${CFLAGS} lib.c -c -o lib.o
缩进是我的问题。
我的IDE使用的是TAB字符而不是空格。在vim中打开Makefile,做了一个:retab
用2个空格重新缩放该行并且已经解决了。