【问题标题】:Makefile error: unexpected end of lineMakefile 错误:意外的行尾
【发布时间】:2014-02-11 23:50:28
【问题描述】:

我已经阅读了类似的问题,但找不到我的问题的解决方案。这是有问题的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 行“看到意外的行尾”。这是怎么回事?

编辑:我更改了疯狂的重复内容,但仍然出现相同的错误。

【问题讨论】:

  • GNU make 永远不会在任何地方打印带有单词“unexpected”的错误消息。这真的是确切的错误消息吗(在寻求帮助时,您永远不应该解释错误消息:始终剪切并粘贴整个准确的消息)?如果是,那么要么您没有使用 GNU make(请指定您正在使用的操作系统和 make),或者此错误不是由 make 生成的。当您收到该错误时,很可能这是正在编译的任何源文件中的问题。同样,如果您剪切并粘贴错误消息,这将立即清楚,并避免很多混乱。
  • 好的,准确的错误信息:“make: Fatal error in reader: makefile, line 4: Unexpected end of line seen”这是在 SunOS 上,所以不是 GNU make。
  • 那我真的帮不上忙。我的怀疑是,在从 Powerpoint (!) 剪切和粘贴的过程中,一些特殊的非 ASCII 字符在第 4 行潜入,这很难看到。也许-Wall 中的- 不是ASCII 连字符(代码45),而是Solaris 无法识别的一些扩展的em 或en dash 字符。我会尝试使用 vi 或 Emacs 等简单的文本编辑器从头开始输入这个 makefile,或者至少是第 4 行。或者,您可以使用 od -a Makefile 之类的东西,看看第 4 行是否有任何奇怪的字符。
  • 啊,Sun make(1s) 的乐趣。我很清楚,因为我在 Solaris 内核上工作,这就是我们使用的工具。问题就像我在其他地方的回答中提到的那样重新制作解析器。幸运的是,make(1s) 联机帮助页写得相当好。即便如此,这是一个非常复杂的野兽,我仍然必须每周至少检查一次。

标签: c makefile


【解决方案1】:

第一个命令上的单美元是什么意思?

<tab>$(CC) >>$<< $(CC) ...

【讨论】:

    【解决方案2】:

    “第 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 标志。发送 cc -flags 以查看 Studio C 提供哪些选项。

    【讨论】:

    • 这就是我从 powerpoint 复制而没有仔细检查的结果!
    • 我编辑了我的原始帖子,因为即使在修复了那些无聊的东西之后,我仍然会遇到同样的错误。
    • 首先,您的 $(CC) 行上仍有虚假试用 o。其次,您希望$^ 扩展到什么?
    • 感谢您的关注。如果你不知道的话,我还很陌生。我期待$^ 扩展到给定规则的先决条件。我正在构建proj05,它依赖于proj05.support.o和proj05.driver.o,每个都依赖于对应的.c文件。
    • 我认为您最好使用 .c.o 规则和 .o->exe 规则,而不是在这种情况下使用 $^。
    【解决方案3】:

    您可能有不同系统的换行符表达式(例如,Unix makefile 中的 Windows 换行符)。

    您可以在 Notepad++ 中修复它:编辑->EOL 转换->Unix(或 Windows 或旧 Mac),或者您可以在您正在编译的机器上手动重新输入换行符。

    【讨论】:

      【解决方案4】:

      不同部分之间不需要空行吗? James 的 sn-p 有 %.o: 目标,后跟一个空行,然后是 $(EXE): 目标,然后是一个空行,然后是 clean: 目标。

      现在我想多了,我相信空行不是可选的。

      在您的 sn-p 中,尝试在以 &lt;tab&gt; 开头的行和以 clean: 开头的行之间放置一个空行。

      【讨论】:

      • 规则之间不需要空行。事实上,您甚至可以编写这样的规则:%.o: %.c ; $(COMPILE.c) $(CFLAGS) -o $@ $&lt; ... 如果您愿意。有时这是一种恰当的表达方式,有时则不然。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-16
      相关资源
      最近更新 更多