【问题标题】:Unix makefile errors " 'ake: Fatal error: Don't know how to make (c file here)"Unix makefile 错误“'ake: Fatal error: Don't know how to make (c file here)”
【发布时间】:2010-02-17 00:59:43
【问题描述】:

我已经写了下面的makefile:

hw2p1: hw2p1_main.o hw2p1_getit.o hw2p1_parseit.o hw2p1_moveit.o hw2p1_showit.o
    gcc hw2p1_main.o hw2p1_getit.o hw2p1_parseit.o hw2p1_moveit.o hw2p1_showit.o
hw2p1_main.o: hw2p1_main.c
    gcc -c hw2p1_main.c
hw2p1_getit.o: hw2p1_getit.c
    gcc -c hw2p1_getit.c
hw2p1_parseit.o: hw2p1_parseit.c
    gcc -c hw2p1_parseit.c
hw2p1_moveit.o: hw2p1_moveit.c
    gcc -c hw2p1_moveit.c
hw2p1_showit.o: hw2p1_showit.c
    gcc -c hw2p1_showit.c

我第一次尝试调用 make 时出现错误:“make: Fatal error: unexpected end of line seen” 我删除了目标之间的空白行并再次调用 make,但这次我得到了“'ake:致命错误:不知道如何制作 hw2p1_main.c"

我已经分别编译了所有这些文件,然后将它们链接起来,所以我知道错误是由于 makefile 不正确而不是我的 c 文件中的错误造成的。

这是我写过的第一个 makefile,所以我可能只是做错了。无论哪种方式,有关如何摆脱这些错误的任何建议?

【问题讨论】:

  • 所以我打开了我的文件,让它显示所有的空格和行尾。事实证明,我使用的编辑器使它在每行末尾都有回车和换行。由于某种原因,回车阻止了正确找到目标。当我在 unix 终端中重写程序时,结果发现只有换行符。这个文件确实有效,所以经过这么长时间,问题解决了。
  • 阅读那个让我很生气的文件让我想起了 bop it..

标签: c unix gcc makefile


【解决方案1】:

当目录无意中不是它应有的目录时,可能会发生这种情况,因此看起来hw2p1_main.c 的缺席要求创建 C 源文件的规则。

也可能是文件名拼写错误。

【讨论】:

  • 另外,第一条规则实际上并没有产生名为hw2p1的输出,这应该不是问题,但值得修复。
  • 我刚刚返回并添加了链接命令,三次检查所有拼写并确保所有内容都在同一个目录中,但我仍然收到相同的错误。
【解决方案2】:

您似乎缺少链接命令中的 -o,尽管这可能还不是您的想法。直接的抱怨是 make 找不到那个 .c 文件。确定它在当前工作目录中?

【讨论】:

    【解决方案3】:

    首先,尝试一个只编译一个东西的makefile:

    hw2p1_moveit.o: hw2p1_moveit.c
        gcc -o moveit.o -c hw2p1_moveit.c
    

    另外,请确保第二行使用 TAB 字符,而不是空格。 (我必须在我的编辑器中手动设置它,因为空格是唯一聪明的方法:)

    【讨论】:

    • 我刚试过这个,我得到了和上面一样的错误。一切都在同一个目录中并且拼写正确。
    • 嗯。你能从linux shell发布你的输出吗?用我们简化的 makefile 给出“cat Makefile; make”的输出?
    • 所以你可以调用make,这将执行makefile的第一行,或者你想说make hw2p1_moveit.o - not ".c" 还有 -这是我帖子中的一个错误——你想说“gcc -o hw2p1_moveit.o”。这指定了输出文件的名称。
    【解决方案4】:

    您的 Makefile 比它需要的复杂得多。让 Make 使用它的隐含规则。它知道如何从 foo.c 生成 foo.o,你不需要告诉它。您的整个 Makefile 可以简化为:

    OBJS = hw2p1_main.o hw2p1_getit.o hw2p1_parseit.o hw2p1_moveit.o hw2p1_showit.o hw2p1: $(OBJS) $(CC) $(CFLAGS) $(CPPFLAGS) $(OBJS) -o $@

    正如其他人所指出的——确保使用实际的制表符进行缩进。 Make对此非常挑剔。

    【讨论】:

      【解决方案5】:

      只是在黑暗中刺伤,但文件名的大小写匹配吗?来自 windows/apple 世界的一些人对 unix 文件名区分大小写感到惊讶。

      您可以通过从错误输出中准确复制文件名并尝试列出它来检查这一点,即ls -l <paste>。这也应该告诉你文件名中是否嵌入了一些控制字符,这也可能是你的问题。

      【讨论】:

        【解决方案6】:

        这个答案几乎永远不会出现!好的,所以基本上我找到了解决方案。您编写的makefile 是正确的。但是,您必须在 EMACS 中创建它。很奇怪吧?我有一个提交到期,并在记事本中编写了我的 makefile 并将其上传到大学服务器,它从未运行过!我尝试使用不同的代码变体,但没有成功。然后我沮丧地在 EMACS 中重新输入了整个内容,它就成功了。无需修改代码。试一试!

        【讨论】:

          【解决方案7】:

          如果你确定

          1) 它说丢失的所有文件都与 makefile 位于同一目录中,或者按照指示的路径位于其他目录中

          2) 所有命令行都包含制表符而不是空格(最简单的检查方法是在第一个字符处按左箭头键,它应该返回起始位置(行位置的第 0 个字符)

          那么大多数时候问题是Makefile的文件格式 如果您在具有 PC (CR/LF) 行格式的编辑器中键入文件,则必须将其设置为 CR 文件格式。

          因此,您可以在 vi 或 emacs 或任何其他具有 UNIX 默认文件格式的编辑器中键入 Makefile,如果允许设置,它将工作或在您的编辑器中将您的文档文件格式设置为 UNIX 类型。

          这必须适用于所有类型的错误 'ake: 致命错误:不知道如何创建目标 (OR) <BR/> 'ake: Fatal error: Don't know how to make target(lastfilename in line)

          希望这会有所帮助。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-01-01
            • 1970-01-01
            • 2022-11-20
            • 2022-11-20
            • 2022-12-04
            • 2022-12-16
            • 1970-01-01
            • 2016-11-19
            相关资源
            最近更新 更多