我已经阅读了类似的问题,但找不到我的问题的解决方案。这是有问题的makefile:
EXE = proj05
SOURCES = proj05.support.c proj05.driver.c
OBJECTS := $(SOURCES:%.c=%.o)
CCFLAGS = -Wall
$(EXE): $(OBJECTS)
<tab>$(CC) $^ -o $@ o
clean:
<tab>$(RM) $(EXE) $(OBJECTS)
当我尝试运行make时,我收到一条错误,说“第4行意外的行结束”。发生了什么事?
编辑:我改变了疯狂的重复内容,但仍然得到同样的错误。
答案 0 :(得分:1)
第一个命令的单一美元有什么用?
<tab>$(CC) >>$<< $(CC) ...
答案 1 :(得分:1)
“第4行”有点误导,但这是$(EXE)
规则的行,它的解析器
在决定不能再进行之前得到了。正如@ jia103所提到的那样
你的$(EXE)规则中有一个假的$
。你也有出现的东西
编译器标志语法不正确 - 不应该有任何空格
在-
和o
之间形成输出arg -o $@
。
我可以建议使用以下规则,而不是$(EXE)
和clean
规则
你有吗?
%.o: %.c
<tab>$(CC) $(CFLAGS) -o $@ $<
$(EXE): $(OBJECTS)
<tab>$(CC) $(CFLAGS) -o $@ $(OBJECTS)
clean:
<tab>$(RM) $(EXE) $(OBJECTS)
(记得改成实际的制表符......)
最后一件事 - 如果您正在使用Solaris和Sun Make,那么您的c编译器实际上是Solaris Studio的可能性很大。在这种情况下,-Wall
标志不起作用 - 这是一个gcc标志。请{I} cc -flags
查看Studio C可用的选项。
答案 2 :(得分:1)
可能有不同系统的换行符表达式(例如Unix makefile中的Windows换行符号)。
您可以在Notepad ++中修复它:edit-&gt; EOL转换 - &gt; Unix(或Windows或旧Mac),或者您可以在要编译的机器上手动重新输入换行符。
答案 3 :(得分:0)
你不需要在不同部分之间留空吗? James的代码段有%.o:
个目标,后跟一个空白行,然后是$(EXE):
目标,后跟一个空行,然后是clean:
目标。
现在我想起来了,我相信空行不是可选的。
在您的代码段中,尝试在以<tab>
开头的那个和以clean:
开头的那个之间加一个空行。